【问题标题】:Need to use dynamic variables to build the 'execute sp_executesql' parameters需要使用动态变量来构建 'execute sp_executesql' 参数
【发布时间】:2016-03-02 21:55:25
【问题描述】:

我有一个关于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

然后就可以了!

有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    评论太长了。

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

    declare @Totals table (year int, total decimal(18, 6));
    
    .  . .
    
    execute sp_executesql @strSQL, @parmDef, @outDef;
    
    insert into @Totals(year, total)
        select @year, @total;
    

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

    【讨论】:

    • @year 绝对是我正在使用的一个变量,您能否详细说明如何从您的示例中填充“@year”和“@total”?另外,您如何定义“@outDef”?为该参数使用该变量是导致错误的原因 thx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多