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