In SQL Server kun je de sp_columns
. gebruiken systeem opgeslagen procedure om kolominformatie te retourneren voor de opgegeven objecten die in de huidige omgeving kunnen worden opgevraagd. Dergelijke objecten omvatten tabellen, weergaven of andere objecten die kolommen hebben, zoals functies met tabelwaarde.
U kunt informatie krijgen voor een specifieke kolom, of u kunt alle kolommen van een bepaalde tabel, weergave, enz. specificeren.
Syntaxis
De syntaxis gaat als volgt:
sp_columns [ @table_name = ] object [ , [ @table_owner = ] owner ] [ , [ @table_qualifier = ] qualifier ] [ , [ @column_name = ] column ] [ , [ @ODBCVer = ] ODBCVer ]
De @table_name
argument is het enige vereiste argument. Dit is de naam van de tabel/het object waarvan u de kolominformatie wilt hebben.
De andere argumenten zijn optioneel. Zie de Microsoft-documentatie voor meer informatie over deze argumenten.
Deze opgeslagen procedure vereist SELECT
en VIEW DEFINITION
machtigingen voor het schema.
Voorbeeld 1 – Informatie teruggeven voor een specifieke kolom
Dit voorbeeld gebruikt alle mogelijke argumenten. Het retourneert informatie voor een specifieke kolom, in een specifieke tabel, van een specifieke tabeleigenaar, in een specifieke database.
EXEC sp_columns @table_name = 'Cities', @table_owner = 'Application', @table_qualifier = 'WideWorldImporters', @column_name = 'Location', @ODBCVer = 2;
Resultaat (met verticale uitvoer):
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)
Hier is een beknoptere manier om het te doen:
EXEC sp_columns 'Cities', 'Application', 'WideWorldImporters', 'Location', 2;
Dat levert dezelfde resultaten op.
Voorbeeld 2 – Specificeer alleen een tabel
In dit voorbeeld schakel ik over naar een andere database en geef ik alleen de tabelnaam op.
USE Music; EXEC sp_columns @table_name = 'Artists';
Resultaat (met verticale uitvoer):
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)
Dit retourneert informatie voor alle kolommen in de opgegeven tabel.
Je moet wel in de juiste database zitten. Als ik het vorige voorbeeld opnieuw uitvoer op een andere database, krijg ik geen resultaten.
USE WideWorldImporters; EXEC sp_columns @table_name = 'Artists';
Resultaat:
Changed database context to 'WideWorldImporters'. (0 rows affected)
Voorbeeld 3 – Over de tabelkwalificatie
Als u de @table_qualifier
. opgeeft argument, moet het hetzelfde zijn als de huidige database. Als dit niet het geval is, wordt er een fout geretourneerd.
USE Music; EXEC sp_columns @table_name = 'Artists', @table_qualifier = 'WideWorldImporters';
Resultaten:
Msg 15250, Level 16, State 1, Line 24 The database name component of the object qualifier must be the name of the current database.
In dit voorbeeld schakelde ik over naar de "Muziek"-database, maar gebruikte toen een tabelkwalificatie van "WideWorldImporters", wat resulteerde in het retourneren van foutbericht 15250.
In dit geval had ik een tabelkwalificatie van "Muziek" moeten gebruiken. Als alternatief had ik het argument helemaal kunnen weglaten.
Voorbeeld 4 – Weergaven
De syntaxis is hetzelfde, ongeacht het objecttype. Hier is een voorbeeld van het verkrijgen van kolominformatie voor een weergave:
EXEC sp_columns @table_name = 'Customers', @table_owner = 'Website', @column_name = 'CustomerID';
Resultaten:
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
Dat is toevallig kolominformatie voor een weergave.
In dit geval, als ik de tabeleigenaar uit de query weglaat, worden twee rijen geretourneerd:
EXEC sp_columns @table_name = 'Customers', @column_name = 'CustomerID';
Resultaten:
-[ 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)
Er worden twee rijen geretourneerd omdat er twee objecten zijn die 'Klanten' worden genoemd. De ene is een weergave en de andere is een tafel. De tafeleigenaar voor de weergave wordt "Website" genoemd en de tafeleigenaar voor de tafel wordt "Verkoop" genoemd.
Voorbeeld 5 – Functies met tabelwaarde
Zoals vermeld, kunt u ook kolominformatie krijgen voor een functie met tabelwaarde.
Hier is een voorbeeld van het ophalen van kolominformatie voor een functie met tabelwaarde. Nogmaals, de syntaxis is hetzelfde.
EXEC sp_columns @table_name = 'DetermineCustomerAccess';
Resultaten:
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