Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Ottieni informazioni sulla colonna per una tabella o una vista in SQL Server (T-SQL:sp_columns)

In SQL Server puoi utilizzare sp_columns stored procedure di sistema per restituire le informazioni sulla colonna per gli oggetti specificati che possono essere interrogati nell'ambiente corrente. Tali oggetti includono tabelle, viste o altri oggetti che hanno colonne come funzioni con valori di tabella.

Puoi ottenere informazioni per una colonna specifica oppure puoi specificare tutte le colonne da una determinata tabella, vista, ecc.

Sintassi

La sintassi è questa:

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

Il @table_name argomento è l'unico argomento richiesto. Questo è il nome della tabella/oggetto da cui vuoi le informazioni sulla colonna.

Gli altri argomenti sono facoltativi. Per ulteriori informazioni su questi argomenti, vedere la documentazione Microsoft.

Questa procedura memorizzata richiede SELECT e VIEW DEFINITION autorizzazioni sullo schema.

Esempio 1 – Informazioni sulla restituzione per una colonna specifica

Questo esempio utilizza tutti gli argomenti possibili. Restituisce informazioni per una colonna specifica, in una tabella specifica, da un proprietario di tabella specifico, in un database specifico.

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

Risultato (usando l'output verticale):

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)

Ecco un modo più conciso per farlo:

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

Ciò restituisce gli stessi risultati.

Esempio 2:specifica solo una tabella

In questo esempio passo a un altro database e specifico solo il nome della tabella.

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

Risultato (usando l'output verticale):

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)

Questo restituisce informazioni per tutte le colonne nella tabella specificata.

Tuttavia, devi essere nel database corretto. Se eseguo nuovamente l'esempio precedente su un database diverso, non ottengo risultati.

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

Risultato:

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

Esempio 3 – Informazioni sul qualificatore al tavolo

Se fornisci il @table_qualifier argomento, deve essere lo stesso del database corrente. In caso contrario, viene restituito un errore.

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

Risultati:

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

In questo esempio sono passato al database "Music", ma poi ho utilizzato un qualificatore di tabella di "WideWorldImporters", che ha provocato la restituzione di un messaggio di errore 15250.

In questo caso, avrei dovuto utilizzare un qualificatore di tabella di "Musica". In alternativa, avrei potuto omettere del tutto l'argomento.

Esempio 4 – Visualizzazioni

La sintassi è la stessa, indipendentemente dal tipo di oggetto. Ecco un esempio di come ottenere informazioni sulla colonna per una vista:

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

Risultati:

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

Si tratta di informazioni sulla colonna per una vista.

In questo caso, se ometto il proprietario della tabella dalla query, vengono restituite due righe:

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

Risultati:

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

Vengono restituite due righe perché sono presenti due oggetti chiamati "Clienti". Uno è una vista e l'altro è un tavolo. Il proprietario della tabella per la visualizzazione si chiama "Sito web" e il proprietario della tabella per la tabella si chiama "Vendite".

Esempio 5 – Funzioni con valori di tabella

Come accennato, puoi anche ottenere informazioni sulla colonna per una funzione con valori di tabella.

Ecco un esempio di come ottenere informazioni sulla colonna per una funzione con valori di tabella. Ancora una volta, la sintassi è la stessa.

EXEC sp_columns
  @table_name = 'DetermineCustomerAccess'; 

Risultati:

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