variable una stored sp_execute resultado query parametrizada guardar funciones dinámicas dinamico dinamicas consultas consulta asignar sql-server string

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