2009-04-16 27 views
2

我不知道如何解決這個錯誤:運行sp_executesql的查詢需要參數@statement

過程或函數「sp_executesql的」需要參數「@statement」,但未提供。

此查詢:

DECLARE @a INT 
DECLARE @b VARCHAR 
SET @a = 1 

WHILE @a < 30 
BEGIN 
set @b = @a 
exec sp_executesql update source_temp set pmt_90_day = pmt_90_day + convert(money,'trans_total_'[email protected])+N' 
    N'where convert(datetime,'effective_date_'[email protected])+N' <= dateadd(day,90,ORSA_CHARGE_OFF_DATE) 
    and DRC_FLAG_'[email protected] = 'C''' 

SET @a = @a + 1 
END 

而且,你能幫助我理解N的正確使用方法」,如果它的這一說法正確。

感謝您的幫助。

回答

1

「sp_executesql」存儲過程期望執行一個字符串參數@statement。

你的字符串完全不符合這裏.....你需要在字符串前加上N'......'來使它們成爲Unicode字符串,但這肯定是不正確的這裏的情況。

我想你可能想試試這個:

DECLARE @a INT 
DECLARE @b VARCHAR(2) 

SET @a = 1 

DECLARE @statement NVARCHAR(500) 

WHILE @a < 30 
BEGIN 
    SET @b = CAST(@a AS VARCHAR(2)) 

    SET @statement = 
     N'update source_temp set pmt_90_day = pmt_90_day + ' + 
      'convert(money, ''trans_total_' + @b + ''') ' + 
      'where convert(datetime, ''effective_date_' + @b + ''')' + 
      ' <= DATEADD(DAY, 90, ORSA_CHARGE_OFF_DATE) ' + 
      'and DRC_FLAG_' + @b + ' = ''C''' 

    exec sp_executesql @statement 

    SET @a = @a + 1 
END 

這是否工作,做你期望它做什麼?

說明:N'.........'分隔包含SQL語句的整個字符串。裏面的任何撇號必須重複(「轉義」)。我希望我能正確理解你的邏輯。

馬克

+0

我試圖在一個循環中動態地運行我的更新,所以每次迭代更新字段的增量爲1.它是從http://stackoverflow.com/questions/753947/using-while-loop-for -SQL-服務器更新 – homerjay 2009-04-16 16:26:30

+0

例如:迭代1使用effective_date_1,迭代2使用effective_date_2等 – homerjay 2009-04-16 16:27:20

1

SP的預期字符串類型,而不是一個SQL語句的變量。總結你的SQL在單引號:

exec sp_executesql 'some SQL statement'; 

當你做到這一點,用兩個單引號替換每個單引號逃逸聲明中任何單引號:

exec sp_executesql 'select 'AB' from dual'; -- wrong 

exec sp_executesql 'select ''AB'' from dual'; -- right 

我不知道什麼N是。你覺得它是什麼?它是否會轉換成字符集?你爲什麼認爲這是必要的?

相關問題