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.
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