В SQL Server можете да използвате sp_columns
системна съхранена процедура за връщане на информация за колони за посочените обекти, които могат да бъдат запитани в текущата среда. Такива обекти включват таблици, изгледи или други обекти, които имат колони, като функции с таблица.
Можете да получите информация за конкретна колона или можете да посочите всички колони от дадена таблица, изглед и т.н.
Синтаксис
Синтаксисът е така:
sp_columns [ @table_name = ] object [ , [ @table_owner = ] owner ] [ , [ @table_qualifier = ] qualifier ] [ , [ @column_name = ] column ] [ , [ @ODBCVer = ] ODBCVer ]
@table_name
аргументът е единственият задължителен аргумент. Това е името на таблицата/обекта, от който искате информацията за колоната.
Другите аргументи са незадължителни. За повече информация относно тези аргументи вижте документацията на Microsoft.
Тази съхранена процедура изисква SELECT
и VIEW DEFINITION
разрешения за схемата.
Пример 1 – Информация за връщане за конкретна колона
Този пример използва всички възможни аргументи. Той връща информация за конкретна колона, в конкретна таблица, от конкретен собственик на таблица, в конкретна база данни.
EXEC sp_columns @table_name = 'Cities', @table_owner = 'Application', @table_qualifier = 'WideWorldImporters', @column_name = 'Location', @ODBCVer = 2;
Резултат (с помощта на вертикален изход):
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)
Ето един по-сбит начин да го направите:
EXEC sp_columns 'Cities', 'Application', 'WideWorldImporters', 'Location', 2;
Това връща същите резултати.
Пример 2 – Посочете само таблица
В този пример преминавам към друга база данни и посочвам само името на таблицата.
USE Music; EXEC sp_columns @table_name = 'Artists';
Резултат (с помощта на вертикален изход):
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)
Това връща информация за всички колони в посочената таблица.
Все пак трябва да сте в правилната база данни. Ако стартирам отново предишния пример в друга база данни, няма да получа резултати.
USE WideWorldImporters; EXEC sp_columns @table_name = 'Artists';
Резултат:
Changed database context to 'WideWorldImporters'. (0 rows affected)
Пример 3 – Относно квалификатора на таблица
Ако предоставите @table_qualifier
аргумент, той трябва да е същият като текущата база данни. Ако не е, се връща грешка.
USE Music; EXEC sp_columns @table_name = 'Artists', @table_qualifier = 'WideWorldImporters';
Резултати:
Msg 15250, Level 16, State 1, Line 24 The database name component of the object qualifier must be the name of the current database.
В този пример преминах към базата данни „Музика“, но след това използвах квалификатор на таблица на „WideWorldImporters“, което доведе до връщане на грешка Msg 15250.
В този случай трябваше да използвам квалификатор на таблица на „Музика“. Като алтернатива можех да пропусна аргумента изобщо.
Пример 4 – Изгледи
Синтаксисът е един и същ, независимо от типа на обекта. Ето пример за получаване на информация за колона за изглед:
EXEC sp_columns @table_name = 'Customers', @table_owner = 'Website', @column_name = 'CustomerID';
Резултати:
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
Това е информация за колона за изглед.
В този случай, ако пропусна собственика на таблицата от заявката, се връщат два реда:
EXEC sp_columns @table_name = 'Customers', @column_name = 'CustomerID';
Резултати:
-[ 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)
Връщат се два реда, защото има два обекта, наречени „Клиенти“. Едното е гледка, а другото е маса. Собственикът на таблицата за изгледа се нарича „Уебсайт“, а собственикът на таблицата за таблицата се нарича „Продажби“.
Пример 5 – Функции с таблична стойност
Както споменахме, можете също да получите информация за колони за функция с таблично значение.
Ето пример за получаване на информация за колона за функция с таблица. Още веднъж синтаксисът е същият.
EXEC sp_columns @table_name = 'DetermineCustomerAccess';
Резултати:
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