sql-server - una - sql consultas dinámicas
Asignar resultado de sql dinámico a variable (4)
La mayoría de estas respuestas usan sp_executesql como solución a este problema. He descubierto que existen algunas limitaciones al usar sp_executesql, que no entraré, pero quería ofrecer una alternativa usando EXEC () . Estoy usando SQL Server 2008 y sé que algunos de los objetos que estoy usando en este script no están disponibles en las versiones anteriores de SQL Server, así que ten cuidado.
DECLARE @CountResults TABLE (CountReturned INT)
DECLARE
@SqlStatement VARCHAR(8000) = ''SELECT COUNT(*) FROM table''
, @Count INT
INSERT @CountResults
EXEC(@SqlStatement)
SET @Count = (SELECT CountReturned FROM @CountResults)
SELECT @Count
Estoy haciendo SQL dinámico para convertir todas las columnas en una tabla de una cadena
entonces después de todo lo que hago
EXEC(@template);
donde @template es la consulta generada dinámica así que:
col1 col2 col3
---------------
1 7 13
2 8 14
3 9 15
4 10 16
5 11 17
6 12 18
(esto resulta: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18)
¿Cómo asigno a una variable la cadena resultante?
¿algo como?
DECLARE @result AS varchar(max);
SET @result = EXEC(@template);
Muestra para ejecutar una cadena SQL dentro del procedimiento almacenado:
(Estoy usando esto para comparar el número de entradas en cada tabla como primer control para una prueba de regresión, dentro de un ciclo de cursor)
select @SqlQuery1 = N''select @CountResult1 = (select isnull(count(*),0) from '' + @DatabaseFirst+''.dbo.''+@ObjectName + '')''
execute sp_executesql @SqlQuery1 , N''@CountResult1 int OUTPUT'', @CountResult1 = @CountResult1 output;
Puede usar sp_executesql
lugar de exec
. Eso le permite especificar un parámetro de salida.
declare @out_var varchar(max);
execute sp_executesql
N''select @out_var = ''''hello world'''''',
N''@out_var varchar(max) OUTPUT'',
@out_var = @out_var output;
select @out_var;
Esto imprime "hola mundo".
Puede usar sp_executesql con el parámetro de salida.
declare @S nvarchar(max) = ''select @x = 1''
declare @xx int
set @xx = 0
exec sp_executesql @S, N''@x int out'', @xx out
select @xx
Resultado:
(No column name)
1
Editar
En mi muestra, @S
es en lugar de su @template
. Como puede ver, asigno un valor a @x
por lo que debe modificar @template
para que internamente asigne la cadena separada por comas a la variable que defina en su segundo argumento a sp_executesql
. En mi muestra N''@x int out''
. Probablemente desee un parámetro de salida varchar(max)
. Algo así como N''@Result varchar(max) out''
Aquí hay otro ejemplo que construye una cadena separada por comas de master..spt_values
declare @template nvarchar(max)
set @template =
''select @Result += cast(number as varchar(10))+'''',''''
from master..spt_values
where type = ''''P''''
''
declare @CommaString varchar(max)
set @CommaString = ''''
exec sp_executesql @template, N''@Result varchar(max) out'', @CommaString out
select @CommaString