2

現在、SQL ジョブを使用して CSV ファイルの内容をインポートしています (BULK INSERT)。LEFT JOIN ステートメントを使用して、重複があるかどうかを確認し、見つかった場合は挿入しないようにします。ただし、列が重複している場合は、代わりに列を更新したいと思います。
私のCSVファイルのファイルは次のとおりです。
|UserType|Lname|Fname|Mname|ContactNo|Email|Password|Balance|Status

これが私のLEFT JOINステートメントです。

INSERT INTO tblAccount
SELECT CSVTable.AccountID,
CSVTable.UserType,
CSVTable.Lname,
CSVTable.Fname,
CSVTable.Mname,
CSVTable.ContactNo,
CSVTable.Email,
CSVTable.Password,
CSVTable.EPurseBalance,
CSVTable.AccountStatus
FROM CSVTable
       LEFT JOIN tblAccount 
         ON CSVTable.AccountID = tblAccount.AccountID
WHERE tblAccount.AccountID  IS NULL



UPDATE重複が見つかった場合は、既存のレコードを希望します。ユーザーのAccountStatus. ユーザーが既に Accounts テーブルにいるが、アカウントが非アクティブ化されている場合、行全体ではなく列のみを更新したいと思いAccountStatusます。

私の現在のステートメントは、一部の列が異なるかどうかに関係なく、重複するエントリを破棄します。データが存在しない場合は挿入できますが、既に存在する場合は列を更新できますか?

私の質問に答える努力は大歓迎です!

編集 MERGE コマンドを試しました。これが私の声明です:

MERGE 
   tblAccount AS target
USING 
   CSVTable AS source
ON 
   target.AccountID = source.AccountID 
WHEN MATCHED THEN 
INSERT INTO tblAccount
SELECT CSVTable.AccountID,
        CSVTable.UserType,
        CSVTable.Lname,
        CSVTable.Fname,
        CSVTable.Mname,
        CSVTable.Address,
        CSVTable.Gender,
        CSVTable.Birthdate,
        CSVTable.ContactNo,
        CSVTable.Email,
        CSVTable.Password,
        CSVTable.EPurseBalance,
        CSVTable.AccountStatus
FROM CSVTable
       LEFT JOIN tblAccount 
         ON CSVTable.AccountID = tblAccount.AccountID
WHERE tblAccount.AccountID  IS NULL



WHEN NOT MATCHED THEN 
   UPDATE SET tblAccount.AccountStatus = CSVTable.AccountStatus
; 



これは機能せず、SQL サーバーからエラーがスローされます。

Msg 156, Level 15, State 1, Line 8
Incorrect syntax near the keyword 'INTO'.
Msg 156, Level 15, State 1, Line 29
Incorrect syntax near the keyword 'WHEN'.


LEFT JOIN ステートメントを MERGE に挿入しようとしましたが、役に立ちませんでした。何か案は?ありがとう!

4

1 に答える 1

1

以下のリンクが参考になると思います

http://technet.microsoft.com/en-us/library/bb522522%28v=sql.105%29.aspx

于 2014-02-22T05:37:36.080 に答える