0

私は数時間動的結合を研究していて、これを理解するのに問題があります。XMLフィードデータを一時SQLテーブルに一括読み込みしてから、一時テーブルから本番テーブルを追加/更新しています。ただし、必要に応じてデータを保持するために、条件付きロジックを使用することも試みています。以下のコードは基本的に、SQL Server 2008以降でのみ使用可能なMerge()メソッドの複製です(実稼働サーバーは2005です)。特に、このクエリで実装する必要がある条件付きロジックは、一時テーブルの[eMail]フィールドが空白でない場合、本番テーブルのそのフィールドを更新することです。それ以外の場合は、(データを保持するために)運用サーバーの[eMail]フィールドを更新しないでください。これが私が試したものですが、構文が正しくないために機能しません。

UPDATE rt
SET rt.[AccountID] = tmp.[AccountID],
  rt.[CustNbr] = tmp.[CustNbr],
  rt.[ClientID] = tmp.[ClientID],
  rt.[ClientX] = tmp.[ClientX],
  rt.[CorpID] = tmp.[CorpID],
  rt.[fName] = tmp.[fName],
  rt.[lName] = tmp.[lName],
  rt.[Position] = tmp.[Position],
  rt.[eMail] = tmp.[eMail],
  rt.[ClientNotes] = tmp.[ClientNotes],
  rt.[DeptID] = tmp.[DeptID]
 FROM AccountClient rt
 IF(SELECT eMail FROM AccountClientTemp) <> ''
     INNER JOIN AccountClientTemp tmp
        ON  tmp.[fName] = rt.[fName]
        and tmp.[lName] = rt.[lName]
        --and tmp.[eMail] = rt.[eMail]
        and tmp.[Position] = rt.[Position]
        and tmp.[DeptID] = rt.[DeptID]
ELSE
    INNER JOIN AccountClientTemp tmp
        ON  tmp.[fName] = rt.[fName]
        and tmp.[lName] = rt.[lName]
        and tmp.[eMail] = rt.[eMail]
        and tmp.[Position] = rt.[Position]
        and tmp.[DeptID] = rt.[DeptID]
INSERT INTO AccountClient
        ([AccountID], [CustNbr], [ClientID], [CorpID], [fName], [lName], [Position],
         [eMail], [ClientNotes], [DeptID])
        SELECT  tmp.[AccountID], tmp.[CustNbr], tmp.[ClientID], tmp.[CorpID], tmp.[fName], tmp.[lName],
        tmp.[Position], tmp.[eMail], tmp.[ClientNotes], tmp.[DeptID]
        FROM AccountClientTemp tmp
        LEFT JOIN AccountClient rt
            ON tmp.[fName] = rt.[fName]
            and tmp.[lName] = rt.[lName]
            and tmp.[eMail] = rt.[eMail]
            and tmp.[Position] = rt.[Position]
        WHERE rt.[fName] IS NULL
         and rt.[lName] IS NULL
         and rt.[eMail] IS NULL
         and rt.[Position] IS NULL
4

1 に答える 1

0

クエリの途中に「if」ステートメントを置くことはできません。したがって、更新は次のようになります。

UPDATE rt
    SET rt.[AccountID] = tmp.[AccountID],
        rt.[CustNbr] = tmp.[CustNbr],
        rt.[ClientID] = tmp.[ClientID],
        rt.[ClientX] = tmp.[ClientX],
        rt.[CorpID] = tmp.[CorpID],
        rt.[fName] = tmp.[fName],
        rt.[lName] = tmp.[lName],
        rt.[Position] = tmp.[Position],
        rt.[eMail] = (case when tmp.[eMail] = '' then rt.eMail else tmp.eMail end),
        rt.[ClientNotes] = tmp.[ClientNotes],
        rt.[DeptID] = tmp.[DeptID]
    FROM AccountClient rt
         INNER JOIN AccountClientTemp tmp
         ON  tmp.[fName] = rt.[fName] and
             tmp.[lName] = rt.[lName] and
             (tmp.[eMail] = rt.[eMail] or tmp.eMail = '') and
             tmp.[Position] = rt.[Position] and
             tmp.[DeptID] = rt.[DeptID];

一見すると、INSERTは問題ないように見えます。

于 2012-08-16T18:56:44.080 に答える