0

ユーザーテーブルを持つデータベースがあります。すべてのユーザーを csv ファイルで更新したい。SqlBulkCopy を使用して csv ファイルを一時テーブルにインポートしました。

次のステップは、一時テーブルを使用してユーザー テーブルを更新するストアド プロシージャを作成することです。これまでのところ、私はこれを持っています:

USE [Userdata]
GO
/****** Object:  StoredProcedure [dbo].[aml_UserImport]    Script Date: 03/06/2013 14:11:44 ******/
SET ANSI_NULLS OFF
GO
SET QUOTED_IDENTIFIER OFF
GO
-- =============================================
-- Author:      michiel reyers
-- Create date: 07-01-2013
-- Description: 
-- =============================================
CREATE PROCEDURE [dbo].[aml_UserImport2]

AS

    SET NOCOUNT ON;

    MERGE users
        USING temp_users ON temp_users.ID = users.ID
        WHEN MATCHED 
            THEN UPDATE SET users.typeId = temp_users.typeId,
                                users.Name = temp_users.Name,
                                users.active = 1
        WHEN NOT MATCHED BY SOURCE
            THEN UPDATE SET users.active = 0
        WHEN NOT MATCHED BY TARGET
            THEN Insert (ID,typeID,Name,active) 
            VALUES (temp_users.ID,temp_users.typeId,temp_users.Name,1)
    ;

これを実行しようとすると、エラーが発生します:

メッセージ 102、レベル 15、状態 1、プロシージャ aml_UserImport2、行 13 'MERGE' 付近の構文が正しくありません。

私は何を間違っていますか?

半円柱を追加しましたが、まだ運がありません:-(

アップデート:

再確認しましたが、MS SQL Server Management 2008 R2 を使用しています。私のデータベースの互換性レベルは SQL Server 2005 (90) のようです。それはおそらく、これが機能しない理由を説明しています....

みんな、ありがとう!

4

3 に答える 3

1

私の提案は次のとおりです。

  1. マージ式の最後にセミコロンを追加します
  2. ACTIVE フィールド = INT として定義されているかどうかを確認してください。TINYINT の場合は、明示的に 1 をキャストしてください
于 2013-03-06T14:47:59.360 に答える
1

入れて; 合流後。

MERGE ステートメントには、ステートメント ターミネータとしてセミコロン (;) が必要です。ターミネータなしで MERGE ステートメントを実行すると、エラー 10713 が発生します (MSDN より)。

于 2013-03-06T14:42:42.137 に答える
0

;SQL サーバーを使用した Merge ステートメントでは、セミコロンで終了する必要があります

ここで構文を確認してくださいMSDN

MERGE users
    USING temp_users ON temp_users.ID = users.ID
    WHEN MATCHED 
        THEN UPDATE SET users.typeId = temp_users.typeId,
                        users.Name = temp_users.Name,
                        users.active = 1
    WHEN NOT MATCHED BY SOURCE
        THEN UPDATE SET users.active = 0
    WHEN NOT MATCHED BY TARGET
        THEN Insert (ID,typeID,Name,active) 
            VALUES (temp_users.ID,temp_users.typeId,temp_users.Name,1);
于 2013-03-06T14:53:42.927 に答える