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