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.