sql >> Databáze >  >> RDS >> Sqlserver

Získejte informace o sloupcích pro tabulku nebo zobrazení v SQL Server (T-SQL:sp_columns)

V SQL Server můžete použít sp_columns systémová uložená procedura pro vrácení informací o sloupcích pro zadané objekty, na které lze v aktuálním prostředí zadat dotaz. Mezi takové objekty patří tabulky, pohledy nebo jiné objekty, které mají sloupce, jako jsou funkce s hodnotou tabulky.

Můžete získat informace pro konkrétní sloupec nebo můžete zadat všechny sloupce z dané tabulky, zobrazení atd.

Syntaxe

Syntaxe vypadá takto:

sp_columns [ @table_name = ] object  
     [ , [ @table_owner = ] owner ]   
     [ , [ @table_qualifier = ] qualifier ]   
     [ , [ @column_name = ] column ]   
     [ , [ @ODBCVer = ] ODBCVer ]

@table_name argument je jediný požadovaný argument. Toto je název tabulky/objektu, ze kterého chcete informace o sloupcích.

Ostatní argumenty jsou volitelné. Další informace o těchto argumentech naleznete v dokumentaci společnosti Microsoft.

Tato uložená procedura vyžaduje SELECT a VIEW DEFINITION oprávnění ke schématu.

Příklad 1 – Vrácení informací pro konkrétní sloupec

Tento příklad používá všechny možné argumenty. Vrací informace pro konkrétní sloupec, v konkrétní tabulce, od konkrétního vlastníka tabulky, v konkrétní databázi.

EXEC sp_columns
  @table_name = 'Cities', 
  @table_owner = 'Application',   
  @table_qualifier = 'WideWorldImporters',   
  @column_name = 'Location',
  @ODBCVer = 2;

Výsledek (při použití vertikálního výstupu):

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)

Zde je stručnější způsob, jak to udělat:

EXEC sp_columns
  'Cities', 
  'Application',   
  'WideWorldImporters',   
  'Location',
  2;

To vrátí stejné výsledky.

Příklad 2 – Určení pouze tabulky

V tomto příkladu přepnu do jiné databáze a zadávám pouze název tabulky.

USE Music;
EXEC sp_columns @table_name = 'Artists';

Výsledek (při použití vertikálního výstupu):

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)

To vrátí informace pro všechny sloupce v zadané tabulce.

Musíte však být ve správné databázi. Pokud znovu spustím předchozí příklad na jiné databázi, nedostanu žádné výsledky.

USE WideWorldImporters;
EXEC sp_columns @table_name = 'Artists';

Výsledek:

Changed database context to 'WideWorldImporters'.
(0 rows affected)

Příklad 3 – O kvalifikátoru tabulky

Pokud zadáte @table_qualifier argument, musí být stejný jako aktuální databáze. Pokud tomu tak není, vrátí se chyba.

USE Music;
EXEC sp_columns
  @table_name = 'Artists',
  @table_qualifier = 'WideWorldImporters';

Výsledky:

Msg 15250, Level 16, State 1, Line 24
The database name component of the object qualifier must be the name of the current database.

V tomto příkladu jsem přešel na databázi „Music“, ale pak jsem použil kvalifikátor tabulky „WideWorldImporters“, což vedlo k vrácení chybové zprávy 15250.

V tomto případě jsem měl použít tabulkový kvalifikátor „Hudba“. Případně jsem mohl argument úplně vynechat.

Příklad 4 – Zobrazení

Syntaxe je stejná, bez ohledu na typ objektu. Zde je příklad získání informací o sloupcích pro zobrazení:

EXEC sp_columns
  @table_name = 'Customers',
  @table_owner = 'Website',
  @column_name = 'CustomerID'; 

Výsledky:

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

To jsou informace o sloupcích pro zobrazení.

V tomto případě, pokud z dotazu vynechám vlastníka tabulky, vrátí se dva řádky:

EXEC sp_columns
  @table_name = 'Customers',
  @column_name = 'CustomerID'; 

Výsledky:

-[ 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)

Jsou vráceny dva řádky, protože existují dva objekty nazývané „Zákazníci“. Jeden je pohled a druhý je stůl. Vlastník tabulky pro zobrazení se nazývá „Web“ a vlastník tabulky pro tabulku se nazývá „Prodej“.

Příklad 5 – tabulkové funkce

Jak již bylo zmíněno, můžete také získat informace o sloupcích pro funkci s hodnotou tabulky.

Zde je příklad získání informací o sloupcích pro funkci s hodnotou tabulky. Syntaxe je opět stejná.

EXEC sp_columns
  @table_name = 'DetermineCustomerAccess'; 

Výsledky:

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. Systémové databáze SQL Server – Obnovení systémových databází

  2. Profilování dotazů 101 – Ano, skutečně může zlepšit výkon vašeho SQL serveru

  3. Jaký je v SQL / MySQL rozdíl mezi ON a WHERE v příkazu spojení?

  4. Jak LOCATE() funguje v MariaDB