Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Obtenir les informations de colonne pour une table ou une vue dans SQL Server (T-SQL :sp_columns)

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