sql >> Databasteknik >  >> RDS >> Sqlserver

Få kolumninformation för en tabell eller vy i SQL Server (T-SQL:sp_columns)

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

  1. Använda DMV ( Dynamic Management View ) och DMF ( Dynamic Management Function ) | SQL Server Performance Felsökning -4

  2. Lär dig MySQL – New Technology Week

  3. Lägga till fler datalager till Microsoft Power BI

  4. Vad är SQLite