Come ottenere il risultato sp_executesql in una variabile?

Ho un pezzo di SQL dinamico che devo eseguire, quindi ho bisogno di memorizzare il risultato in una variabile.

So che posso usare sp_executesql ma non riesco a trovare esempi chiari su come farlo.

Se disponi di parametri OUTPUT, puoi farlo

 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; 

Ma se non lo fai, e non puoi modificare l’SP:

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

Non carina, ma funziona.

 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 ' EXEC SP_EXECUTESQL @Query = @vQuery , @Params = N'@vi INT OUTPUT' , @vi = @vi OUTPUT SELECT @vi 

Dichiara @variable int

Exec @variable = proc_name

Se vuoi restituire più di un valore, usa questo:

 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; 

i valori restituiti sono in @retIndex e @retText

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 

I valori di ritorno non sono generalmente usati per “restituire” un risultato ma per restituire successo (0) o un numero di errore (1-65K). Quanto sopra sembra indicare che sp_executesql non restituisce un valore, che non è corretto. sp_executesql restituirà 0 per il successo e qualsiasi altro numero per il fallimento.

Nel seguito, @i restituirà 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 mostrerà questo messaggio 2727, livello 11, stato 1, riga 1 Imansible trovare l’indice ‘NonExistantStaticsName’.

Questo è stato molto tempo fa, quindi non è sicuro se è ancora necessario, ma è ansible utilizzare @@ ROWCOUNT variabile per vedere quante righe sono state interessate dalla precedente istruzione sql.

Questo è utile quando per esempio costruisci un’istruzione di aggiornamento dynamic ed eseguila con exec. @@ ROWCOUNT mostrerebbe quante righe sono state aggiornate.

Ecco la definizione