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