No SQL Server você pode usar o
sp_columns
procedimento armazenado do sistema para retornar informações de coluna para os objetos especificados que podem ser consultados no ambiente atual. Esses objetos incluem tabelas, exibições ou outros objetos que possuem colunas, como funções com valor de tabela. Você pode obter informações para uma coluna específica ou pode especificar todas as colunas de uma determinada tabela, exibição etc.
Sintaxe
A sintaxe fica assim:
sp_columns [ @table_name = ] object [ , [ @table_owner = ] owner ] [ , [ @table_qualifier = ] qualifier ] [ , [ @column_name = ] column ] [ , [ @ODBCVer = ] ODBCVer ]
O
@table_name
argumento é o único argumento necessário. Este é o nome da tabela/objeto da qual você deseja obter as informações da coluna. Os outros argumentos são opcionais. Para obter mais informações sobre esses argumentos, consulte a documentação da Microsoft.
Este procedimento armazenado requer
SELECT
e VIEW DEFINITION
permissões no esquema. Exemplo 1 – Informações de retorno para uma coluna específica
Este exemplo usa todos os argumentos possíveis. Ele retorna informações para uma coluna específica, em uma tabela específica, de um proprietário de tabela específico, em um banco de dados específico.
EXEC sp_columns @table_name = 'Cities', @table_owner = 'Application', @table_qualifier = 'WideWorldImporters', @column_name = 'Location', @ODBCVer = 2;
Resultado (usando saída vertical):
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)
Aqui está uma maneira mais concisa de fazer isso:
EXEC sp_columns 'Cities', 'Application', 'WideWorldImporters', 'Location', 2;
Isso retorna os mesmos resultados.
Exemplo 2 – Especificar apenas uma tabela
Neste exemplo, mudo para outro banco de dados e especifico apenas o nome da tabela.
USE Music; EXEC sp_columns @table_name = 'Artists';
Resultado (usando saída vertical):
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)
Isso retorna informações para todas as colunas na tabela especificada.
Você precisa estar no banco de dados correto embora. Se eu executar novamente o exemplo anterior em um banco de dados diferente, não obtenho resultados.
USE WideWorldImporters; EXEC sp_columns @table_name = 'Artists';
Resultado:
Changed database context to 'WideWorldImporters'. (0 rows affected)
Exemplo 3 – Sobre o qualificador de mesa
Se você fornecer o
@table_qualifier
argumento, ele deve ser o mesmo que o banco de dados atual. Se não estiver, um erro é retornado. USE Music; EXEC sp_columns @table_name = 'Artists', @table_qualifier = 'WideWorldImporters';
Resultados:
Msg 15250, Level 16, State 1, Line 24 The database name component of the object qualifier must be the name of the current database.
Neste exemplo, mudei para o banco de dados “Music”, mas usei um qualificador de tabela de “WideWorldImporters”, que resultou no retorno da mensagem de erro 15250.
Nesse caso, eu deveria ter usado um qualificador de mesa de “Música”. Alternativamente, eu poderia ter omitido completamente o argumento.
Exemplo 4 – Visualizações
A sintaxe é a mesma, independentemente do tipo de objeto. Aqui está um exemplo de como obter informações de coluna para uma visualização:
EXEC sp_columns @table_name = 'Customers', @table_owner = 'Website', @column_name = 'CustomerID';
Resultados:
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
Isso acontece de ser informações de coluna para uma exibição.
Nesse caso, se eu omitir o proprietário da tabela da consulta, duas linhas serão retornadas:
EXEC sp_columns @table_name = 'Customers', @column_name = 'CustomerID';
Resultados:
-[ 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)
Duas linhas são retornadas porque existem dois objetos chamados "Clientes". Um é uma vista e o outro é uma mesa. O proprietário da tabela para a exibição é chamado de "Website" e o proprietário da tabela para a tabela é chamado de "Vendas".
Exemplo 5 – Funções com valor de tabela
Conforme mencionado, você também pode obter informações de coluna para uma função com valor de tabela.
Aqui está um exemplo de como obter informações de coluna para uma função com valor de tabela. Mais uma vez, a sintaxe é a mesma.
EXEC sp_columns @table_name = 'DetermineCustomerAccess';
Resultados:
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