Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Obter informações de coluna para uma tabela ou exibição no SQL Server (T-SQL:sp_columns)


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