type statement sp_executesql sp_execute parameter nchar expects example ejemplos tsql dynamic-sql

tsql - statement - ¿Cómo obtener sp_executesql resultado en una variable?



sp_executesql output (8)

Tengo una pieza de SQL dinámico que necesito ejecutar, luego necesito almacenar el resultado en una variable.

Sé que puedo usar sp_executesql pero no puedo encontrar ejemplos claros acerca de cómo hacer esto.


DECLARE @ValueTable TABLE (Value VARCHAR (100))

SELECT @sql = N''SELECT SRS_SizeSetDetails.''+@COLUMN_NAME+'' FROM SRS_SizeSetDetails WHERE FSizeID = ''''''+@FSizeID+'''''' AND SRS_SizeSetID = ''''''+@SRS_SizeSetID+''''''''; INSERT INTO @ValueTable EXEC sp_executesql @sql; SET @Value=''''; SET @Value = (SELECT TOP 1 Value FROM @ValueTable) DELETE FROM @ValueTable


Declare @variable int

Exec @variable = proc_name


Esto fue hace mucho tiempo, por lo que no estoy seguro de si esto todavía es necesario, pero podría usar la variable @@ ROWCOUNT para ver cuántas filas se vieron afectadas con la instrucción sql anterior.

Esto es útil cuando, por ejemplo, construyes una declaración dinámica de actualización y la ejecutas con exec. @@ ROWCOUNT mostraría cuántas filas se actualizaron.

Aquí está la definición


Los valores de retorno generalmente no se usan para "devolver" un resultado sino para devolver el éxito (0) o un número de error (1-65K). Todo lo anterior parece indicar que sp_executesql no devuelve un valor, que no es correcto. sp_executesql devolverá 0 para el éxito y cualquier otro número para el fracaso.

En el siguiente, @i devolverá 2727

DECLARE @s NVARCHAR(500) DECLARE @i INT; SET @s = ''USE [Blah]; UPDATE STATISTICS [dbo].[TableName] [NonExistantStatisticsName];''; EXEC @i = sys.sp_executesql @s SELECT @i AS ''Blah''

SSMS mostrará este Msg 2727, Nivel 11, Estado 1, Línea 1 No se puede encontrar el índice ''NonExistantStaticsName''.


Si desea devolver más de 1 valor, use esto:

DECLARE @sqlstatement2 NVARCHAR(MAX); DECLARE @retText NVARCHAR(MAX); DECLARE @ParmDefinition NVARCHAR(MAX); DECLARE @retIndex INT = 0; SELECT @sqlstatement = ''SELECT @retIndexOUT=column1 @retTextOUT=column2 FROM XXX WHERE bla bla''; SET @ParmDefinition = N''@retIndexOUT INT OUTPUT, @retTextOUT NVARCHAR(MAX) OUTPUT''; exec sp_executesql @sqlstatement, @ParmDefinition, @retIndexOUT=@retIndex OUTPUT, @retTextOUT=@retText OUTPUT;

los valores devueltos están en @retIndex y @retText


Si tiene parámetros de SALIDA que puede hacer

DECLARE @retval int DECLARE @sSQL nvarchar(500); DECLARE @ParmDefinition nvarchar(500); DECLARE @tablename nvarchar(50) SELECT @tablename = N''products'' SELECT @sSQL = N''SELECT @retvalOUT = MAX(ID) FROM '' + @tablename; SET @ParmDefinition = N''@retvalOUT int OUTPUT''; EXEC sp_executesql @sSQL, @ParmDefinition, @retvalOUT=@retval OUTPUT; SELECT @retval;

Pero si no lo hace, y no puede modificar el SP:

-- Assuming that your SP return 1 value create table #temptable (ID int null) insert into #temptable exec mysp ''Value1'', ''Value2'' select * from #temptable

No es bonito, pero funciona.


DECLARE @tab AS TABLE (col VARCHAR(10), colu2 varchar(10)) INSERT into @tab EXECUTE sp_executesql N''SELECT 1 as col1, 2 as col2 union all SELECT 1 as col1, 2 as col2 union all SELECT 1 as col1, 2 as col2'' SELECT * FROM @tab


DECLARE @vi INT DECLARE @vQuery VARCHAR(1000) SET @vQuery = ''SELECT @vi= COUNT(*) FROM <TableName>'' EXEC SP_EXECUTESQL @Query = @vQuery , @Params = N''@vi INT OUTPUT'' , @vi = @vi OUTPUT SELECT @vi