sql >> Base de Datos >  >> RDS >> Sqlserver

Obtener información de columna para una tabla o vista en SQL Server (T-SQL:sp_columns)

En SQL Server puede usar sp_columns procedimiento almacenado del sistema para devolver información de columna para los objetos especificados que se pueden consultar en el entorno actual. Dichos objetos incluyen tablas, vistas u otros objetos que tienen columnas, como funciones con valores de tabla.

Puede obtener información para una columna específica o puede especificar todas las columnas de una tabla, vista, etc.

Sintaxis

La sintaxis es así:

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

El @table_name argumento es el único argumento requerido. Este es el nombre de la tabla/objeto del que desea obtener la información de la columna.

Los otros argumentos son opcionales. Para obtener más información sobre estos argumentos, consulte la documentación de Microsoft.

Este procedimiento almacenado requiere SELECT y VIEW DEFINITION permisos en el esquema.

Ejemplo 1:información de devolución para una columna específica

Este ejemplo utiliza todos los argumentos posibles. Devuelve información para una columna específica, en una tabla específica, de un propietario de tabla específico, en una base de datos específica.

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

Resultado (usando salida 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)

Esta es una forma más concisa de hacerlo:

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

Eso devuelve los mismos resultados.

Ejemplo 2:especificar solo una tabla

En este ejemplo, cambio a otra base de datos y solo especifico el nombre de la tabla.

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

Resultado (usando salida 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)

Esto devuelve información para todas las columnas en la tabla especificada.

Sin embargo, debe estar en la base de datos correcta. Si vuelvo a ejecutar el ejemplo anterior en una base de datos diferente, no obtengo resultados.

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

Resultado:

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

Ejemplo 3:sobre el calificador de tabla

Si proporciona el @table_qualifier argumento, debe ser el mismo que el de la base de datos actual. Si no es así, se devuelve un error.

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.

En este ejemplo, cambié a la base de datos "Música", pero luego usé un calificador de tabla de "WideWorldImporters", lo que resultó en la devolución del mensaje de error 15250.

En este caso, debería haber usado un calificador de tabla de “Música”. Alternativamente, podría haber omitido el argumento por completo.

Ejemplo 4:Vistas

La sintaxis es la misma, independientemente del tipo de objeto. Este es un ejemplo de cómo obtener información de columna para una vista:

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

Esa es la información de la columna para una vista.

En este caso, si omito el propietario de la tabla de la consulta, se devuelven dos filas:

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)

Se devuelven dos filas porque hay dos objetos llamados "Clientes". Una es una vista y la otra es una mesa. El propietario de la tabla para la vista se llama "Sitio web" y el propietario de la tabla para la tabla se llama "Ventas".

Ejemplo 5:funciones con valores de tabla

Como se mencionó, también puede obtener información de columna para una función con valores de tabla.

Aquí hay un ejemplo de cómo obtener información de columna para una función con valores de tabla. Una vez más, la sintaxis es la misma.

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