Describir el resultado de una consulta o procedimiento

Necesitamos integrar una consulta en una aplicación, pero no sabemos con certeza qué nombres, tipos y nulabilidad devolverá. Ejecutarla con datos reales puede ser costoso o exigir parámetros que todavía no tenemos preparados.

Qué necesitamos distinguir

Un conjunto de resultados es el grupo tabular de filas y columnas que devuelve una instrucción. Su contrato define la forma que el consumidor puede esperar.

Pediremos a SQL Server que analice el primer conjunto de resultados posible sin ejecutar la consulta. La descripción permite revisar el contrato tabular; no representa filas reales ni garantiza que todas las rutas de ejecución produzcan el mismo resultado.

El contrato tabular describe las columnas que recibirá el consumidor: nombre, posición, tipo y posibilidad de contener NULL. No incluye la cardinalidad, es decir, la cantidad de filas que devolverá una ejecución concreta.

Consulta

/*
    Antes de ejecutar:
        Revisa la base activa, los nombres de objetos, los parámetros y los permisos.
        Adapta el ejemplo a tu modelo y pruébalo primero en un ambiente controlado.
*/

SET NOCOUNT ON;
GO
-- Descripción de una consulta
DECLARE @Consulta NVARCHAR(MAX) = N'
    SELECT
        c.IdCliente,
        c.Nombre,
        c.Correo,
        COUNT_BIG(p.IdPedido) AS CantidadPedidos
    FROM dbo.Cliente AS c
    LEFT JOIN dbo.Pedido AS p
        ON p.IdCliente = c.IdCliente
    WHERE c.Activo = @Activo
    GROUP BY
        c.IdCliente,
        c.Nombre,
        c.Correo;';

DECLARE @Parametros NVARCHAR(4000) = N'@Activo bit';

SELECT
    r.column_ordinal AS Posicion,
    r.name AS Columna,
    r.system_type_name AS TipoDevuelto,
    r.is_nullable AS PuedeSerNula,
    r.source_schema AS EsquemaOrigen,
    r.source_table AS TablaOrigen,
    r.source_column AS ColumnaOrigen,
    r.is_identity_column AS EsIdentity,
    r.is_computed_column AS EsCalculada,
    r.error_number AS NumeroError,
    r.error_message AS MensajeError
FROM sys.dm_exec_describe_first_result_set
(
    @Consulta,
    @Parametros,
    0
) AS r
ORDER BY r.column_ordinal;
GO

-- Descripción de un procedimiento
EXEC sys.sp_describe_first_result_set
    @tsql = N'EXEC dbo.ConsultarPedidos @IdCliente = @Cliente;',
    @params = N'@Cliente int',
    @browse_information_mode = 0;
GO

Parámetros o permisos

Incluye en @Parametros cada parámetro usado por el lote, con el mismo nombre y un tipo compatible. La consulta se analiza en la base actual; los nombres de dos partes, permisos y objetos temporales dependen de ese contexto. Se necesitan permisos suficientes para compilar y consultar los objetos referenciados. La visibilidad de las columnas de origen también puede limitarse por permisos de metadatos.

Cómo leer el resultado

Posicion, Columna y TipoDevuelto permiten construir el orden y tipo del contrato. PuedeSerNula describe lo que el analizador puede deducir, que puede ser más conservador que la regla funcional conocida por la aplicación. Las columnas de origen se completan cuando SQL Server puede rastrearlas. Una expresión agregada o calculada puede no tener una columna fuente directa. Si el lote no puede determinar un primer resultado compatible, revisa NumeroError y MensajeError. Rutas condicionales con columnas diferentes, SQL dinámico y algunas tablas temporales pueden impedir una descripción estable.

Qué conclusión sí permite obtener

Permite anticipar nombres, orden, tipos y otras propiedades del primer conjunto de resultados que SQL Server puede deducir sin ejecutar el lote.

Qué conclusión todavía no permite obtener

No devuelve datos, tiempos, cardinalidad ni plan real de ejecución. Tampoco describe un segundo conjunto de resultados y no garantiza que una ruta dinámica construida durante la ejecución conserve el contrato observado.

Siguiente comprobación razonable

Compara la descripción con el modelo esperado por la aplicación. Después ejecuta una prueba controlada con parámetros representativos y valida valores nulos, conversiones y conjuntos vacíos.

Índice del recorrido

Desarrollo y exploración

22 artículos de Desarrollo y exploración
  1. 01Buscar una tabla o vista por nombre
  2. 02Buscar una columna en toda la base
  3. 03Buscar texto dentro de procedimientos, vistas y funciones
  4. 04Consultar dependencias de un objeto
  5. 05Listar relaciones y llaves foráneas
  6. 06Consultar llaves primarias, restricciones únicas e índices
  7. 07Listar columnas con tipo, longitud, nulabilidad y valor predeterminado
  8. 08Encontrar triggers y sus tablas asociadas
  9. 09Encontrar objetos modificados recientemente
  10. 10Obtener conteos aproximados de todas las tablas
  11. 11Medir el espacio utilizado por cada tabla
  12. 12Revisar columnas IDENTITY y su valor actual
  13. 13Detectar registros duplicados por una clave de negocio
  14. 14Detectar registros huérfanos
  15. 15Comparar dos conjuntos de datos
  16. 16Validar conversiones antes de modificar una columna
  17. 17Ejecutar un UPDATE con validación y reversión controlada
  18. 18Ejecutar un DELETE con respaldo lógico y reversión controlada
  19. 19Comparar la estructura de dos bases de datos
  20. 20Describir el resultado de una consulta o procedimiento
  21. 21Encontrar tablas sin llave primaria
  22. 22Buscar un valor en columnas seleccionadas