2016-03-02 81 views
0

我对使用执行sp_executesql的需要使用动态变量建立“执行sp_executesql的”参数

的一个简单的问题没有进入我的代码,目前导致错误太多细节,我更感兴趣的不同的方法我可以用它来建立EXECUTE sp_executesql的语句

在我的STOR_PROC,我有以下的(含@tTableName & @tVar为被传入参数)

DECLARE @strSQL nVARCHAR(1000) 
DECLARE @parmDef nVARCHAR(100) 
DECLARE @outDef nVARCHAR(100) 

SET @strSQL = N'SELECT @nTotalOut = sum(r.TOT_SALES) FROM @tTableName 
--this procedure is actually in a loop, as I need to provided total sales 
--from multiple years and sales data per year is stored in its own individual table 
--(ie: @tTableName = '2015_Sales_Data', '2014_Sales_Data', etc, etc) 

SET @parmDef = N'@nTotalOut int output' 
set @outDef = N'@nTotalOut=' + @tVar + ' OUTPUT' 

execute sp_executesql @strSQL, @parmDef, @outDef 

我需要动态定义@outDef的原因是因为对于每次迭代,我需要将总销售额存储到自己的变量中(因此@tVar将保存实际变量名称,即:@ nTotal2015,@ nTotal2014,@ nTotal2013,等,等)

在结束时,这个循环完成,我可以做一个

SELECT @nTotal2015, @nTotal2014, @nTotal2013 

,并在1行显示每年的总销售额

问题: 当我跑我的商店程序,我收到以下错误:

Error converting data type nvarchar to int. 

我已经尝试了很多不同的解决办法之前,我决定张贴在这里,但到了最后,我想知道如果我可以建立动态变量

的EXECUTE sp_executesql的语句

有一点需要注意:如果我硬编码的输出参数为:

execute sp_executesql @strSQL, @parmDef, @[email protected] OUTPUT 

然后它的工作!

有什么建议吗?

回答

0

太长的评论。

使用单个变量运行代码并将该值存储在临时表中。

declare @Totals table (year int, total decimal(18, 6)); 

. . . 

execute sp_executesql @strSQL, @parmDef, @outDef; 

insert into @Totals(year, total) 
    select @year, @total; 

这假设你在变量中有一个@year变量正在处理。

+0

@year绝对是我使用的一个变量 能否详细说明'@year'和'@total'将如何从您的示例中填充? 另外,你会如何定义'@outDef'?使用那个参数的变量是什么导致错误 thx – Tommy