需要使用动态变量来构建'execute sp_executesql'参数

时间:2016-03-02 21:55:26

标签: sql sql-server-2008 stored-procedures

我对使用execute 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, @n2015Total=@n2015Total OUTPUT

然后它有效!

有什么建议吗?

1 个答案:

答案 0 :(得分: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个变量。