【问题标题】:best approach to execute a dynamic query inside a SP在 SP 内执行动态查询的最佳方法
【发布时间】:2011-12-23 23:40:03
【问题描述】:

我在我的 SP 中执行动态查询时遇到了一些问题,我想寻求一些帮助,因为无论我尝试什么都无法正确执行它:

我试过了:

SET @subWorksQuery = 
'UPDATE JK_SubscriberWorks SET ' +
'update_date = convert(datetime, ''' + @dateNow + ''', 103), ' +
'challenge_' + convert(nvarchar(2), @challengeDay) + '_q = ''' + @challengeQuestion + ''', ' +
'challenge_' + convert(nvarchar(2), @challengeDay) + '_a = ''' + @challengeAnswer + ''' ' +
'WHERE subscriberwork_id = '' + convert(nvarchar(10), @subscriberWorksId) + '';';

execute @execReturn = @subWorksQuery

但我总是得到:

消息 203,级别 16,状态 2,过程 sp_InsertChallengeResponse_test, 112号线
名称 'UPDATE JK_SubscriberWorks SET update_date = convert(datetime, '23-12-2011 23:35:17', 103), challenge_23_q = 'Hvilket år blev Klassselotteriet omdannet til et aktieselskab?
Få hjælp til svaret.', challenge_23_a = '1992' WHERE subscriberwork_id = ' + 转换(nvarchar(10),@subscriberWorksId)+';'不是有效的 标识符。

从该错误中删除 UPDATE 语句并独立运行,它会运行并执行更新


如果我使用sp_executesql 喜欢

SET @subWorksQuery = 
N'UPDATE JK_SubscriberWorks SET ' +
'update_date = @a, ' +
'challenge_' + convert(nvarchar(2), @challengeDay) + '_q = @b, ' +
'challenge_' + convert(nvarchar(2), @challengeDay) + '_a = @c ' +
'WHERE subscriberwork_id = @d;';

SET @parmDefinition = N'@a datetime, @b nvarchar(250), @c nvarchar(500), @d decimal';

execute sp_executesql 
             @subWorksQuery,
             @parmDefinition,
             @a = @CreateDate, @b = @challengeQuestion, @c = @challengeAnswer, @d = @subscriberWorksId;

它从不执行 UPDATE,但不会抛出任何错误。

我在这里错过了什么?

【问题讨论】:

  • 使用 SQL 查询分析器并修改您的第一个示例以执行 PRINT @subWorksQuery。现在将该 PRINT 语句的输出剪切并粘贴到查询分析器中,看看它的格式是否正确。

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


【解决方案1】:

像这样运行它:

execute (@subWorksQuery)

[你不会从变量中的更新语句中得到任何东西,你不能像这样运行execute (@execReturn = @subWorksQuery)]

如果没有括号,它似乎开始解析,假设它是一个存储过程名称,但是当它达到一个最大长度时失败。

这么说,最好用sp_executesql带参数。

【讨论】:

  • 但在我的第二个示例中,我确实使用了sp_executesql,但我从来没有更新它,并且没有抛出任何错误......
  • @balexandre - 大概没有什么匹配 WHERE 子句。
【解决方案2】:

我不确定您要在返回值中寻找什么,但如果您只需要受影响的行数,那应该很容易获得。

变化:

execute @execReturn = @subWorksQuery

到:

execute (@subWorksQuery)
select @execReturn = @@ROWCOUNT

【讨论】:

    【解决方案3】:

    只是一个想法...您的 @d 参数是一个十进制值。你的 id 是 int 吗?是否存在数据类型冲突?

    你的sp输入参数是怎么定义的?你能发布完整的sp吗?

    戴夫

    【讨论】:

    • 我的 @d 是十进制的,因为 PK 也是十进制的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 2010-09-06
    • 2021-12-31
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多