Ejecutar la característica WITH SETS de RESULTADOS en SQL Server

Con la introducción de SQL Server 2012, se incluyó una característica útil: EJECUTAR CON CONJUNTOS DE RESULTADOS. Esta característica nos permite modifique los nombres de columna y los tipos de datos de columna de los conjuntos de resultados devueltos por un procedimiento almacenado sin modificar realmente el código de procedimiento almacenado.

En un escenario del mundo real, tenemos un procedimiento almacenado heredado que muestra un conjunto de resultados con una columna "CustomerName" con varchar (50) como resultado, y se está ejecutando desde la aplicación de front end de .NET. Debido a un cambio repentino en los requisitos, los desarrolladores de aplicaciones front-end han modificado el código y esperan que el alias del nombre de la columna sea "CustomerFullName" y la longitud del tipo de datos como varchar (100). Para solucionar este problema, necesitamos modificar el código de procedimiento almacenado existente para cumplir con estos nuevos cambios, lo que podría afectar a otros procedimientos almacenados que dependen de él.

Para hacer una solución rápida y considerar los cambios de requisitos, podemos usar la nueva característica de SQL Server EJECUTAR CON CONJUNTOS DE RESULTADOS cambiando el alias de nombre de columna y el tipo de datos al ejecutar los procedimientos almacenados. Esto nos da la ventaja de no modificar el código de procedimiento almacenado existente.

1. Para cambiar el nombre de la columna y el tipo de datos de la columna en tiempo de ejecución mientras se ejecuta un procedimiento almacenado

2. Se puede usar con múltiples conjuntos de resultados devueltos por las consultas para cambiar los nombres de columna y los tipos de datos en tiempo de ejecución

1. No podemos eliminar ninguna columna de un conjunto de resultados existente. Si el conjunto de resultados proporciona tres columnas como salida, debemos definir las tres columnas utilizando la opción CON CONJUNTOS DE RESULTADOS.

2. No podemos cambiar el orden de las columnas en el conjunto de resultados.

3. WITH RESULT SETS no se puede anidar con INSERTAR ... EJEC llamar para almacenar los resultados en una tabla temporal.

EJECUTAR  CON CONJUNTOS DE RESULTADOS {CONJUNTOS DE RESULTADOS NO DEFINIDOS} | {RESULTADO CONJUNTO NINGUNO} | {Conjuntos de resultados ()} 

1. EJECUTAR CON CONJUNTOS DE RESULTADOS CON CONJUNTOS DE RESULTADOS NO DEFINIDOS

AJUSTES DE RESULTADOS NO DEFINIDOS es una opción predeterminada con EJECUTAR CON CONJUNTOS DE RESULTADOS. Si no se especifica ninguna opción utilizando CONJUNTOS DE RESULTADOS, esto se considera de forma predeterminada. Esto se ejecuta sin generar ningún error al devolver los conjuntos de resultados, si los hay.

2. EJECUTE CON CONJUNTOS DE RESULTADOS CON CONJUNTOS DE RESULTADOS NINGUNO

AJUSTES DE RESULTADOS NINGUNO indica que la sentencia ejecutada no devolverá los conjuntos de resultados. Si se usa esta opción y la declaración devuelve cualquier conjunto de resultados, genera un error.

Podemos conducir a través de unos pocos ejemplos, creando una tabla "Jugador" e insertando pocos registros.

SI OBJECT_ID (N'Player ', N'U') NO ES UN NULL DROP TABLE Player; GO Crear tabla Jugador (Id INT, Nombre VARCHAR (100), HighestScore INT); INTRODUCIR LOS VALORES (1, 'Niraj', 120), (2, 'Vish', 51), (3, 'Chetan', 264); 

1. EJECUTAR CON CONJUNTOS DE RESULTADOS: Modificar nombre de columna / tipo de datos

Podemos crear un procedimiento almacenado para devolver todos los nombres de los jugadores y su puntaje más alto.

CREAR PROCEDIMIENTO GetPlayerNameAndScore COMO INICIAR SELECCIONAR Nombre, HighestScore FROM Player; FIN 

Si ejecutamos el procedimiento de la forma habitual, EXEC GetPlayerNameAndScore, obtendremos la columna Nombre y HighestScore en el conjunto de resultados de la siguiente manera:

EXEC GetPlayerNameAndScore 

Ahora, considerando que queremos devolver el conjunto de resultados con un nuevo alias de columna sin modificar el procedimiento almacenado existente, devuelva los conjuntos de resultados con PlayerName con el tipo de datos VARCHAR (50) y la columna PlayerHighScore en lugar de sus nombres originales. Nosotros podemos usar EJECUTAR CON CONJUNTOS DE RESULTADOS.

EXEC GetPlayerNameAndScore CON CONJUNTOS DE RESULTADOS ((PlayerName VARCHAR (50), PlayerHigherScore INT)); 

A continuación, puede ver que el alias de la columna se ha modificado para cumplir con el nuevo cambio.

2. EJECUTAR CON CONJUNTOS DE RESULTADOS: Conjuntos de resultados múltiples

Podemos crear un procedimiento almacenado para devolver varios conjuntos de resultados: número de registros en la tabla de jugadores y lista de jugadores cuyo nombre comienza con C.

CREAR PROCEDIMIENTO Get_Player_Name_Score_Multiple_ResultSets COMO COMENZAR SELECCIONAR Nombre DESDE Jugador DONDE Nombre Como 'C%'; SELECCIONAR CUENTA (1) como MyCount FROM Player; FIN 

Nosotros podemos usar EJECUTAR CON CONJUNTOS DE RESULTADOS para cambiar el alias del primer resultado de Nombre a Nombre del jugador y en el segundo conjunto de resultados, para cambiar el alias de MyCount a PlayerCount.

EXEC Get_Player_Name_Score_Multiple_ResultSets WITH RESULT SETS ((PlayerName VARCHAR (50) - First Result Set), (PlayerCount INT - Second Result Set)); 

3. EJECUTAR CON CONJUNTOS DE RESULTADOS: Error de desajuste de columnas

Estamos utilizando el procedimiento creado en el Ejemplo 1, GetPlayerNameAndScore, que devuelve dos columnas en un conjunto de resultados, y si solo definimos una columna con EJECUTAR CON CONJUNTOS DE RESULTADOS, El servidor SQL genera el siguiente error. Por lo tanto, es necesario incluir todas las columnas con la opción EJECUTAR CON CONJUNTOS DE RESULTADOS.

Tratar de incluir solo la primera columna en un conjunto de resultados no está permitido.

EXEC GetPlayerNameAndScore CON CONJUNTOS DE RESULTADOS ((PlayerName VARCHAR (50))); 

Msg 11537, Nivel 16, Estado 1, Procedimiento GetPlayerNameAndScore, Línea 4
La declaración EXECUTE falló porque su cláusula WITH RESULT SETS especificó una columna para el conjunto de resultados número 1, pero la declaración envió dos columnas en tiempo de ejecución.