Dans SQL Server, vous pouvez utiliser le sp_columns
procédure stockée système pour renvoyer des informations de colonne pour les objets spécifiés qui peuvent être interrogés dans l'environnement actuel. Ces objets incluent des tables, des vues ou d'autres objets qui ont des colonnes telles que des fonctions table.
Vous pouvez obtenir des informations pour une colonne spécifique, ou vous pouvez spécifier toutes les colonnes d'une table, d'une vue, etc.
Syntaxe
La syntaxe ressemble à ceci :
sp_columns [ @table_name = ] object [ , [ @table_owner = ] owner ] [ , [ @table_qualifier = ] qualifier ] [ , [ @column_name = ] column ] [ , [ @ODBCVer = ] ODBCVer ]
Le @table_name
argument est le seul argument requis. Il s'agit du nom de la table/de l'objet dont vous souhaitez obtenir les informations de colonne.
Les autres arguments sont facultatifs. Pour plus d'informations sur ces arguments, consultez la documentation de Microsoft.
Cette procédure stockée nécessite SELECT
et VIEW DEFINITION
autorisations sur le schéma.
Exemple 1 - Renvoyer des informations pour une colonne spécifique
Cet exemple utilise tous les arguments possibles. Il renvoie des informations pour une colonne spécifique, dans une table spécifique, à partir d'un propriétaire de table spécifique, dans une base de données spécifique.
EXEC sp_columns @table_name = 'Cities', @table_owner = 'Application', @table_qualifier = 'WideWorldImporters', @column_name = 'Location', @ODBCVer = 2;
Résultat (en utilisant la sortie 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)
Voici une façon plus concise de procéder :
EXEC sp_columns 'Cities', 'Application', 'WideWorldImporters', 'Location', 2;
Cela renvoie les mêmes résultats.
Exemple 2 - Spécifiez une table uniquement
Dans cet exemple, je passe à une autre base de données et ne spécifie que le nom de la table.
USE Music; EXEC sp_columns @table_name = 'Artists';
Résultat (en utilisant la sortie 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)
Cela renvoie des informations pour toutes les colonnes de la table spécifiée.
Vous devez cependant être dans la bonne base de données. Si je relance l'exemple précédent sur une autre base de données, je n'obtiens aucun résultat.
USE WideWorldImporters; EXEC sp_columns @table_name = 'Artists';
Résultat :
Changed database context to 'WideWorldImporters'. (0 rows affected)
Exemple 3 - À propos du qualificatif de table
Si vous fournissez le @table_qualifier
argument, il doit être identique à la base de données actuelle. Si ce n'est pas le cas, une erreur est renvoyée.
USE Music; EXEC sp_columns @table_name = 'Artists', @table_qualifier = 'WideWorldImporters';
Résultats :
Msg 15250, Level 16, State 1, Line 24 The database name component of the object qualifier must be the name of the current database.
Dans cet exemple, je suis passé à la base de données "Music", mais j'ai ensuite utilisé un qualificatif de table "WideWorldImporters", ce qui a entraîné le renvoi de l'erreur Msg 15250.
Dans ce cas, j'aurais dû utiliser un qualificatif de table "Musique". Alternativement, j'aurais pu omettre complètement l'argument.
Exemple 4 – Vues
La syntaxe est la même, quel que soit le type d'objet. Voici un exemple d'obtention d'informations de colonne pour une vue :
EXEC sp_columns @table_name = 'Customers', @table_owner = 'Website', @column_name = 'CustomerID';
Résultats :
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
Il s'agit d'informations de colonne pour une vue.
Dans ce cas, si j'omets le propriétaire de la table dans la requête, deux lignes sont renvoyées :
EXEC sp_columns @table_name = 'Customers', @column_name = 'CustomerID';
Résultats :
-[ 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)
Deux lignes sont renvoyées car il existe deux objets appelés "Clients". L'un est une vue et l'autre est une table. Le propriétaire de la table pour la vue s'appelle "Site Web", et le propriétaire de la table pour la table s'appelle "Ventes".
Exemple 5 - Fonctions de table
Comme mentionné, vous pouvez également obtenir des informations de colonne pour une fonction table.
Voici un exemple d'obtention d'informations de colonne pour une fonction table. Encore une fois, la syntaxe est la même.
EXEC sp_columns @table_name = 'DetermineCustomerAccess';
Résultats :
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