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

Cómo seleccionar un subconjunto de columnas del conjunto de resultados de un procedimiento almacenado (T-SQL)

¿Alguna vez ejecutó un procedimiento almacenado, solo para sentirse abrumado por la cantidad de columnas devueltas? Tal vez solo necesitabas una o dos columnas, pero te presentó manera demasiadas columnas para sus necesidades en esta ocasión particular.

Afortunadamente, hay un pequeño truco que puede usar para recuperar columnas seleccionadas de un procedimiento almacenado. Esto le permite obtener solo las columnas que necesita.

Y lo mejor es que no implica tener que crear tablas temporales y mezclar los datos.

Todo lo que necesita hacer es pasar su procedimiento almacenado a OPENROWSET() función.

El mismo concepto se puede aplicar a OPENQUERY() función.

Ejemplo

Toma las sp_columns procedimiento almacenado del sistema, por ejemplo. Devuelve 19 columnas.

EXEC sp_columns Cats;

Resultado:

+-------------------+---------------+--------------+---------------+-------------+--------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------+
| TABLE_QUALIFIER   | TABLE_OWNER   | TABLE_NAME   | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME    | PRECISION   | LENGTH   | SCALE   | RADIX   | NULLABLE   | REMARKS   | COLUMN_DEF   | SQL_DATA_TYPE   | SQL_DATETIME_SUB   | CHAR_OCTET_LENGTH   | ORDINAL_POSITION   | IS_NULLABLE   | SS_DATA_TYPE   |
|-------------------+---------------+--------------+---------------+-------------+--------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------|
| Pets              | dbo           | Cats         | CatId         | 4           | int identity | 10          | 4        | 0       | 10      | 0          | NULL      | NULL         | 4               | NULL               | NULL                | 1                  | NO            | 56             |
| Pets              | dbo           | Cats         | CatName       | 12          | varchar      | 60          | 60       | NULL    | NULL    | 1          | NULL      | NULL         | 12              | NULL               | 60                  | 2                  | YES           | 39             |
+-------------------+---------------+--------------+---------------+-------------+--------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------+

Procedimientos como este a menudo requieren que nos desplacemos hacia los lados en una persecución inútil para encontrar las columnas que nos interesan.

Tal vez solo queramos ver 4 columnas específicas en lugar de las 19.

Podemos ejecutar la siguiente consulta para hacer precisamente eso.

SELECT 
    c.COLUMN_NAME,
    c.TYPE_NAME,
    c.PRECISION,
    c.LENGTH
FROM OPENROWSET(
    'SQLOLEDB', 
    'SERVER=localhost;Trusted_Connection=yes;', 
    'EXEC Pets.dbo.sp_columns Cats'
    ) c;

Resultado:

+---------------+--------------+-------------+----------+
| COLUMN_NAME   | TYPE_NAME    | PRECISION   | LENGTH   |
|---------------+--------------+-------------+----------|
| CatId         | int identity | 10          | 4        |
| CatName       | varchar      | 60          | 60       |
+---------------+--------------+-------------+----------+

El OPENROWSET() La función fue diseñada principalmente para recuperar datos remotos, pero también puede usarla en la instancia local, especificando localhost en la cadena de conexión (como he hecho en este ejemplo).

Función OPENQUERY()

Como se mencionó, el mismo concepto se puede aplicar a OPENQUERY() función.

SELECT 
    c.COLUMN_NAME,
    c.TYPE_NAME,
    c.PRECISION,
    c.LENGTH
FROM OPENQUERY(
    Homer,
    'EXEC Pets.dbo.sp_columns Cats'
    ) c;

Resultado:

+---------------+--------------+-------------+----------+
| COLUMN_NAME   | TYPE_NAME    | PRECISION   | LENGTH   |
|---------------+--------------+-------------+----------|
| CatId         | int identity | 10          | 4        |
| CatName       | varchar      | 60          | 60       |
+---------------+--------------+-------------+----------+

En este caso, especifiqué un servidor vinculado llamado Homer en lugar del servidor local.

Si recibe un error que dice "El servidor no está configurado para ACCESO A DATOS", deberá habilitar el acceso a datos para el servidor, incluso si está consultando su instancia local. Consulte Cómo habilitar/deshabilitar el acceso a datos para obtener instrucciones sobre cómo hacerlo.