sql >> Database >  >> RDS >> Sqlserver

Kolominfo ophalen voor een tabel of weergave in SQL Server (T-SQL:sp_columns)

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

  1. De opgeslagen procedure om de instantie-instellingen op te halen

  2. Produceer een `DataSource`-object voor Postgres JDBC, programmatisch

  3. Een opgeslagen procedure plannen in MySQL

  4. Rijen invoegen in een tabel met slechts één IDENTITEIT-kolom