如何获得sp_executesql结果到一个variables?

我有一块我需要执行的dynamicSQL,然后我需要将结果存储到一个variables中。

我知道我可以使用sp_executesql但无法find有关如何执行此操作的明确示例。

如果你有OUTPUT参数,你可以做

 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; 

但是如果你不这样做,也不能修改SP:

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

不漂亮,但工程。

 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 

声明@variable int

Exec @variable = proc_name

返回值通常不用于“返回”结果,而是返回成功(0)或错误号(1-65K)。 以上所有似乎表明,sp_executesql不会返回一个值,这是不正确的。 sp_executesql将返回0成功和任何其他数字的失败。

在下面,@i将返回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将显示消息2727,级别11,状态1,行1找不到索引'NonExistantStaticsName'。

这是很久以前,所以不知道这是否仍然需要,但是可以使用@@ ROWCOUNTvariables来查看以前的sql语句影响了多less行。

例如,当您构builddynamic的Update语句并使用exec运行时,这会很有帮助。 @@ ROWCOUNT会显示更新了多less行。

这是定义

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 @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; 

返回的值是@retIndex和@retText