2009-04-16 2 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を期待します。あなたの文字列はここで完全に調子が悪いです

は.....あなたは彼らにはUnicode文字列を作るには「......」Nと任意の「固定」の文字列の部分の前に付ける必要があるが、これは正しく間違いではありませんここのケース。

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文を含む文字列全体を区切ります。その中のアポストロフィーは複製されなければなりません( "エスケープ")。私はあなたのロジックを正しく理解することを願っています。

Marc

+0

ので、各反復は、1。そのhttp://stackoverflow.com/questions/753947/using-while-loop-forからの参照の増分だけのフィールドを更新します-sql-サーバー更新 – homerjay

+0

例:反復1はeffective_date_1を使用して、iteration2はなど – homerjay

+0

、effective_date_2を使用していますクローサー:Dは、そのアップ宣言トップ – homerjay

1

spには、SQL文ではなくstring型の変数が必要です。単一引用符であなたのSQLをラップ:あなたは、2つの単一引用符で各単一引用符を置き換えることによって、文の中の任意の単一引用符をエスケープすることを行うと

exec sp_executesql 'some SQL statement'; 

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

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

私が持っているNが何であるか全くわかりません。それは何だと思いますか?キャラクターセットに何らかの形でキャストされていますか?なぜそれが必要だと思いますか?私は、ループ内で動的に私の更新を実行しようとしている

+1

N ''はUNICODE(NVARCHAR)文字列を表します –