在SP内部执行动态查询的最佳方法

时间:2011-12-23 23:40:03

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

我在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årblevKlasselotteriet omdannet til et aktieselskab?
Fåhjælptilsvaret。',   challenge_23_a ='1992'WHERERE subscriberwork_id ='+   convert(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,但不会抛出任何错误。

我在这里缺少什么?

3 个答案:

答案 0 :(得分:1)

像这样运行:

execute (@subWorksQuery)

[你不会从变量中的update语句中获得任何回复,并且你不能像这样运行execute (@execReturn = @subWorksQuery)]

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

在说,最好将sp_executesql与参数一起使用。

答案 1 :(得分:0)

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

变化:

execute @execReturn = @subWorksQuery

为:

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

答案 2 :(得分:0)

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

你的sp输入参数是如何定义的?你可以发布完整的sp?

戴夫