sql >> Database teknologi >  >> RDS >> Sqlserver

Få kolonneoplysninger til en tabel eller visning i SQL Server (T-SQL:sp_columns)

I SQL Server kan du bruge sp_columns systemlagret procedure til at returnere kolonneoplysninger for de angivne objekter, der kan forespørges i det aktuelle miljø. Sådanne objekter omfatter tabeller, visninger eller andre objekter, der har kolonner, såsom tabelværdierede funktioner.

Du kan få oplysninger om en specifik kolonne, eller du kan angive alle kolonner fra en given tabel, visning osv.

Syntaks

Syntaksen ser sådan ud:

sp_columns [ @table_name = ] object  
     [ , [ @table_owner = ] owner ]   
     [ , [ @table_qualifier = ] qualifier ]   
     [ , [ @column_name = ] column ]   
     [ , [ @ODBCVer = ] ODBCVer ]

@table_name argument er det eneste nødvendige argument. Dette er navnet på tabellen/objektet, som du vil have kolonneoplysningerne fra.

De øvrige argumenter er valgfrie. For mere information om disse argumenter, se Microsoft-dokumentationen.

Denne lagrede procedure kræver SELECT og VIEW DEFINITION tilladelser på skemaet.

Eksempel 1 – Returoplysninger for en specifik kolonne

Dette eksempel bruger alle mulige argumenter. Det returnerer oplysninger for en specifik kolonne, i en specifik tabel, fra en specifik tabelejer, i en specifik database.

EXEC sp_columns
  @table_name = 'Cities', 
  @table_owner = 'Application',   
  @table_qualifier = 'WideWorldImporters',   
  @column_name = 'Location',
  @ODBCVer = 2;

Resultat (ved hjælp af lodret output):

TABLE_QUALIFIER   | WideWorldImporters
TABLE_OWNER       | Application
TABLE_NAME        | Cities
COLUMN_NAME       | Location
DATA_TYPE         | -4
TYPE_NAME         | geography
PRECISION         | 2147483647
LENGTH            | 2147483647
SCALE             | NULL
RADIX             | NULL
NULLABLE          | 1
REMARKS           | NULL
COLUMN_DEF        | NULL
SQL_DATA_TYPE     | -4
SQL_DATETIME_SUB  | NULL
CHAR_OCTET_LENGTH | 2147483647
ORDINAL_POSITION  | 4
IS_NULLABLE       | YES
SS_DATA_TYPE      | 23
(1 row affected)

Her er en mere kortfattet måde at gøre det på:

EXEC sp_columns
  'Cities', 
  'Application',   
  'WideWorldImporters',   
  'Location',
  2;

Det giver de samme resultater.

Eksempel 2 – Angiv kun en tabel

I dette eksempel skifter jeg til en anden database og angiver kun tabelnavnet.

USE Music;
EXEC sp_columns @table_name = 'Artists';

Resultat (ved hjælp af lodret output):

Changed database context to 'Music'.
-[ RECORD 1 ]-------------------------
TABLE_QUALIFIER   | Music
TABLE_OWNER       | dbo
TABLE_NAME        | Artists
COLUMN_NAME       | ArtistId
DATA_TYPE         | 4
TYPE_NAME         | int identity
PRECISION         | 10
LENGTH            | 4
SCALE             | 0
RADIX             | 10
NULLABLE          | 0
REMARKS           | NULL
COLUMN_DEF        | NULL
SQL_DATA_TYPE     | 4
SQL_DATETIME_SUB  | NULL
CHAR_OCTET_LENGTH | NULL
ORDINAL_POSITION  | 1
IS_NULLABLE       | NO
SS_DATA_TYPE      | 56
-[ RECORD 2 ]-------------------------
TABLE_QUALIFIER   | Music
TABLE_OWNER       | dbo
TABLE_NAME        | Artists
COLUMN_NAME       | ArtistName
DATA_TYPE         | -9
TYPE_NAME         | nvarchar
PRECISION         | 255
LENGTH            | 510
SCALE             | NULL
RADIX             | NULL
NULLABLE          | 0
REMARKS           | NULL
COLUMN_DEF        | NULL
SQL_DATA_TYPE     | -9
SQL_DATETIME_SUB  | NULL
CHAR_OCTET_LENGTH | 510
ORDINAL_POSITION  | 2
IS_NULLABLE       | NO
SS_DATA_TYPE      | 39
-[ RECORD 3 ]-------------------------
TABLE_QUALIFIER   | Music
TABLE_OWNER       | dbo
TABLE_NAME        | Artists
COLUMN_NAME       | ActiveFrom
DATA_TYPE         | -9
TYPE_NAME         | date
PRECISION         | 10
LENGTH            | 20
SCALE             | NULL
RADIX             | NULL
NULLABLE          | 1
REMARKS           | NULL
COLUMN_DEF        | NULL
SQL_DATA_TYPE     | -9
SQL_DATETIME_SUB  | NULL
CHAR_OCTET_LENGTH | NULL
ORDINAL_POSITION  | 3
IS_NULLABLE       | YES
SS_DATA_TYPE      | 0
(3 rows affected)

Dette returnerer oplysninger for alle kolonner i den angivne tabel.

Du skal dog være i den rigtige database. Hvis jeg kører det forrige eksempel igen på en anden database, får jeg ingen resultater.

USE WideWorldImporters;
EXEC sp_columns @table_name = 'Artists';

Resultat:

Changed database context to 'WideWorldImporters'.
(0 rows affected)

Eksempel 3 – Om tabelkvalifikationen

Hvis du angiver @table_qualifier argument, skal det være det samme som den aktuelle database. Hvis den ikke er det, returneres en fejl.

USE Music;
EXEC sp_columns
  @table_name = 'Artists',
  @table_qualifier = 'WideWorldImporters';

Resultater:

Msg 15250, Level 16, State 1, Line 24
The database name component of the object qualifier must be the name of the current database.

I dette eksempel skiftede jeg til "Music"-databasen, men brugte derefter en tabelkvalifikationsindikator for "WideWorldImporters", hvilket resulterede i, at fejlmeddelelse 15250 blev returneret.

I dette tilfælde skulle jeg have brugt en tabelkvalifikation af "Musik". Alternativt kunne jeg have undladt argumentet helt.

Eksempel 4 – Visninger

Syntaksen er den samme, uanset objekttypen. Her er et eksempel på at få kolonneoplysninger til en visning:

EXEC sp_columns
  @table_name = 'Customers',
  @table_owner = 'Website',
  @column_name = 'CustomerID'; 

Resultater:

TABLE_QUALIFIER   | WideWorldImporters
TABLE_OWNER       | Website
TABLE_NAME        | Customers
COLUMN_NAME       | CustomerID
DATA_TYPE         | 4
TYPE_NAME         | int
PRECISION         | 10
LENGTH            | 4
SCALE             | 0
RADIX             | 10
NULLABLE          | 0
REMARKS           | NULL
COLUMN_DEF        | NULL
SQL_DATA_TYPE     | 4
SQL_DATETIME_SUB  | NULL
CHAR_OCTET_LENGTH | NULL
ORDINAL_POSITION  | 1
IS_NULLABLE       | NO
SS_DATA_TYPE      | 56

Det er tilfældigvis kolonneinformation til en visning.

I dette tilfælde, hvis jeg udelader tabelejeren fra forespørgslen, returneres to rækker:

EXEC sp_columns
  @table_name = 'Customers',
  @column_name = 'CustomerID'; 

Resultater:

-[ RECORD 1 ]-------------------------
TABLE_QUALIFIER   | WideWorldImporters
TABLE_OWNER       | Sales
TABLE_NAME        | Customers
COLUMN_NAME       | CustomerID
DATA_TYPE         | 4
TYPE_NAME         | int
PRECISION         | 10
LENGTH            | 4
SCALE             | 0
RADIX             | 10
NULLABLE          | 0
REMARKS           | NULL
COLUMN_DEF        | (NEXT VALUE FOR [Sequences].[CustomerID])
SQL_DATA_TYPE     | 4
SQL_DATETIME_SUB  | NULL
CHAR_OCTET_LENGTH | NULL
ORDINAL_POSITION  | 1
IS_NULLABLE       | NO
SS_DATA_TYPE      | 56
-[ RECORD 2 ]-------------------------
TABLE_QUALIFIER   | WideWorldImporters
TABLE_OWNER       | Website
TABLE_NAME        | Customers
COLUMN_NAME       | CustomerID
DATA_TYPE         | 4
TYPE_NAME         | int
PRECISION         | 10
LENGTH            | 4
SCALE             | 0
RADIX             | 10
NULLABLE          | 0
REMARKS           | NULL
COLUMN_DEF        | NULL
SQL_DATA_TYPE     | 4
SQL_DATETIME_SUB  | NULL
CHAR_OCTET_LENGTH | NULL
ORDINAL_POSITION  | 1
IS_NULLABLE       | NO
SS_DATA_TYPE      | 56
(2 rows affected)

To rækker returneres, fordi der er to objekter kaldet "Kunder". Den ene er udsigt og den anden er et bord. Tabellejeren for visningen hedder "Website", og tabelejeren for tabellen hedder "Salg".

Eksempel 5 – Funktioner med tabelværdi

Som nævnt kan du også få kolonneoplysninger for en tabelværdisat funktion.

Her er et eksempel på at få kolonneoplysninger for en funktion med tabelværdi. Endnu en gang er syntaksen den samme.

EXEC sp_columns
  @table_name = 'DetermineCustomerAccess'; 

Resultater:

TABLE_QUALIFIER   | WideWorldImporters
TABLE_OWNER       | Application
TABLE_NAME        | DetermineCustomerAccess
COLUMN_NAME       | AccessResult
DATA_TYPE         | 4
TYPE_NAME         | int
PRECISION         | 10
LENGTH            | 4
SCALE             | 0
RADIX             | 10
NULLABLE          | 0
REMARKS           | NULL
COLUMN_DEF        | NULL
SQL_DATA_TYPE     | 4
SQL_DATETIME_SUB  | NULL
CHAR_OCTET_LENGTH | NULL
ORDINAL_POSITION  | 1
IS_NULLABLE       | NO
SS_DATA_TYPE      | 56

  1. En oversigt over pgModeler til PostgreSQL

  2. sqlite:hvordan tilføjes samlet tid tt:mm:ss hvor kolonnens datatype er DATETIME?

  3. Neo4j - Slet et forhold ved hjælp af Cypher

  4. Forskellen mellem underforespørgsel og korreleret underforespørgsel