I SQL Server kan du använda sp_columns
systemlagrad procedur för att returnera kolumninformation för de angivna objekten som kan frågas i den aktuella miljön. Sådana objekt inkluderar tabeller, vyer eller andra objekt som har kolumner som tabellvärdade funktioner.
Du kan få information för en specifik kolumn, eller så kan du ange alla kolumner från en given tabell, vy, etc.
Syntax
Syntaxen ser ut så här:
sp_columns [ @table_name = ] object [ , [ @table_owner = ] owner ] [ , [ @table_qualifier = ] qualifier ] [ , [ @column_name = ] column ] [ , [ @ODBCVer = ] ODBCVer ]
@table_name
argument är det enda nödvändiga argumentet. Detta är namnet på tabellen/objektet som du vill ha kolumninformationen från.
De andra argumenten är valfria. Mer information om dessa argument finns i Microsofts dokumentation.
Denna lagrade procedur kräver SELECT
och VIEW DEFINITION
behörigheter för schemat.
Exempel 1 – Returnera information för en specifik kolumn
Detta exempel använder alla möjliga argument. Den returnerar information för en specifik kolumn, i en specifik tabell, från en specifik tabellägare, i en specifik databas.
EXEC sp_columns @table_name = 'Cities', @table_owner = 'Application', @table_qualifier = 'WideWorldImporters', @column_name = 'Location', @ODBCVer = 2;
Resultat (med vertikal utdata):
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)
Här är ett mer kortfattat sätt att göra det:
EXEC sp_columns 'Cities', 'Application', 'WideWorldImporters', 'Location', 2;
Det ger samma resultat.
Exempel 2 – Ange endast en tabell
I det här exemplet byter jag till en annan databas och anger bara tabellnamnet.
USE Music; EXEC sp_columns @table_name = 'Artists';
Resultat (med vertikal utdata):
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)
Detta returnerar information för alla kolumner i den angivna tabellen.
Du måste dock vara i rätt databas. Om jag kör om det föregående exemplet på en annan databas får jag inga resultat.
USE WideWorldImporters; EXEC sp_columns @table_name = 'Artists';
Resultat:
Changed database context to 'WideWorldImporters'. (0 rows affected)
Exempel 3 – Om tabellkvalificeringen
Om du anger @table_qualifier
argument, måste det vara samma som den aktuella databasen. Om det inte är det returneras ett felmeddelande.
USE Music; EXEC sp_columns @table_name = 'Artists', @table_qualifier = 'WideWorldImporters';
Resultat:
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 det här exemplet bytte jag till "Music"-databasen, men använde sedan en tabellkvalificering av "WideWorldImporters", vilket resulterade i att felmeddelande 15250 returnerades.
I det här fallet borde jag ha använt en tabellkvalificering för "Musik". Alternativt kunde jag ha utelämnat argumentet helt och hållet.
Exempel 4 – Visningar
Syntaxen är densamma, oavsett objekttyp. Här är ett exempel på hur du får kolumninformation för en vy:
EXEC sp_columns @table_name = 'Customers', @table_owner = 'Website', @column_name = 'CustomerID';
Resultat:
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 råkar vara kolumninformation för en vy.
I det här fallet, om jag utelämnar tabellägaren från frågan, returneras två rader:
EXEC sp_columns @table_name = 'Customers', @column_name = 'CustomerID';
Resultat:
-[ 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)
Två rader returneras eftersom det finns två objekt som kallas "Kunder". Den ena är en utsikt och den andra är ett bord. Tabellägaren för vyn kallas "Webbplats" och tabellägaren för tabellen heter "Försäljning".
Exempel 5 – Tabellvärdade funktioner
Som nämnts kan du även få kolumninformation för en tabellvärderad funktion.
Här är ett exempel på hur du får kolumninformation för en tabellvärderad funktion. Återigen är syntaxen densamma.
EXEC sp_columns @table_name = 'DetermineCustomerAccess';
Resultat:
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