2011-12-23 81 views
1

我在SP內執行動態查詢時遇到了一些麻煩,我想請求一些幫助,因爲無論我嘗試什麼,都無法正確執行它:在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årblev Klasselotteriet omdannet til et aktieselskab?
Fåhåælptil svaret。', challenge_23_a ='1992'WHERE 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 ,但不會拋出任何錯誤。

缺少什麼我在這裏?

+0

使用SQL查詢分析器並修改您的第一個示例以執行PRINT @subWorksQuery。現在將該PRINT語句的輸出剪切並粘貼到查詢分析器中,並查看它是否正確地形成。 – 2011-12-27 13:35:45

回答

1

運行這樣的:

execute (@subWorksQuery) 

[你不會得到任何東西從update語句後面的變量,你不能像這樣execute (@execReturn = @subWorksQuery)運行]

沒有括號它似乎開始解析,假設它是一個存儲過程的名稱,但在達到一個最大長度時失敗。

這樣說,最好使用帶參數的sp_executesql

+0

但是在我的第二個例子我用'sp_executesql'但我從來沒有得到它的更新,並拋出了沒有錯誤... – balexandre 2011-12-24 00:33:17

+0

@balexandre - 想必沒什麼'WHERE'子句匹配即可。 – 2011-12-24 12:40:07

0

我不確定你在尋找什麼樣的返回值,但是如果你只是需要受影響的行數,那應該很容易獲得。

變化:

execute @execReturn = @subWorksQuery 

到:

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

只是一個想法......你@d參數是一個十進制值。你的ID是int嗎?有沒有可能的數據類型衝突?

您的sp輸入參數是如何定義的?你能發佈完整的sp嗎?

Dave

+0

我的'@ d'是十進制的,因爲PK也是十進制的 – balexandre 2011-12-27 07:08:38