1

これを実行すると、次のようになります。

メッセージ 515、レベル 16、状態 2、行 8
列 'uNSID'、テーブル 'Flickr.dbo.User_Grps' に値 NULL を挿入できません。列はヌルを許可しません。更新は失敗します。
ステートメントは終了されました。

これは私のSQL文です:

MERGE 
INTO User_Grps as ug
USING [ExcImport-S2 (3)] as i
ON (    
    ug.uNSID = i.uNSID
    and ug.prime_ID = i.prime_ID
    and  i.uNSID is not null
    )
WHEN MATCHED and i.uNSID is not null THEN

    UPDATE SET ug.uNSID = i.uNSID
        ,   ug.gNSID = i.gNSID
        ,   ug.gAlias = isnull(i.gAlias,ug.gAlias) 
        ,   ug.Prime_ID = i.Prime_ID

 WHEN NOT MATCHED THEN  
        INSERT (uNSID
            ,   gNSID
            ,   gAlias
            ,   Prime_ID
                )
                VALUES (i.uNSID
            ,   i.gNSID
            ,   i.gAlias
            ,   i.Prime_ID
                );
GO

null レコードを吸い込まないようにするにはどうすればよいですか?

また、最後に次のようなものを取得できるように、カウンターを構成するにはどうすればよいUpdated x,xxx records & added xxxですか?

編集して追加 --------------

@ケビン:これは、あなたの反応を理解したので、修正した後の私のコードです。

そのまま実行すると、次のエラーが発生します。

Msg 102, Level 15, State 1, Line 2  Incorrect syntax near '$ACTION'.
Msg 137, Level 15, State 1, Line 5  Must declare the scalar variable "@InsertCount".
Msg 1087, Level 15, State 2, Line 9 Must declare the table variable "@RowCounts".

行間の部分をコメントアウトすると-- ############################################
、次のエラーが発生します。
Msg 2627, Level 14, State 1, Line 13 Violation of PRIMARY KEY constraint 'PK_User_Grps'. Cannot insert duplicate key in object 'dbo.User_Grps'. The duplicate key value is (GT10464608)

SET NOCOUNT ON ;

DECLARE @RowCounts TABLE
        (
            MergeAction NVARCHAR(10)
        ) ;

DECLARE @InsertCount INT ,
                @UpdateCount INT;

Merge 
into User_Grps as ug
using [ExcImport-S2] as i
on (    
    ug.uNSID = i.uNSID
    and ug.prime_ID = i.prime_ID
    and  i.uNSID is not null
    )
WHEN MATCHED THEN

    UPDATE SET ug.gNSID = i.gNSID
        ,   ug.gAlias = isnull(i.gAlias,ug.gAlias) 
        ,   ug.last_ud = GETDATE ( )


 WHEN NOT MATCHED THEN  
    --      UPDATE SET @i += 1;
        INSERT (uNSID
            ,   gNSID
            ,   gAlias
            ,   Prime_ID
            ,   Last_UD
                )
                VALUES (i.uNSID
            ,   i.gNSID
            ,   i.gAlias
            ,   i.Prime_ID
            ,   GETDATE ( )
                );

    -- ############################################
 OUTPUT
4

2 に答える 2

3

すでに一致しているフィールドを更新から削除します。それらはすでに同じであるため、その必要はありません。

前に次のようなものを追加できます。

SET NOCOUNT ON ;

DECLARE @RowCounts TABLE
    (
      MergeAction NVARCHAR(10)
    ) ;

DECLARE @InsertCount INT ,
    @UpdateCount INT;

そして、これはマージ直後の直後です:

    OUTPUT
        $ACTION
        INTO @RowCounts ;

SELECT  @InsertCount = [INSERT] ,
        @UpdateCount = [UPDATE]
FROM    ( SELECT    MergeAction ,
                    1 AS ROWS
          FROM      @RowCounts
        ) P PIVOT
( COUNT(ROWS) FOR MergeAction IN ( [INSERT], [UPDATE] ) ) AS PVT ;

これにより、行数が得られます。

編集:

OUTPUT 句に関する詳細情報へのリンクhttp://sqlblog.com/blogs/adam_machanic/archive/2009/08/24/dr-output-or-how-i-learned-to-stop-worrying-and-love-the -merge.aspx

シバン全体:

SET NOCOUNT ON ;

DECLARE @RowCounts TABLE
        (
            MergeAction NVARCHAR(10)
        ) ;

DECLARE @InsertCount INT ,
                @UpdateCount INT;

Merge 
into User_Grps as ug
using [ExcImport-S2] as i
on (    
    ug.uNSID = i.uNSID
    and ug.prime_ID = i.prime_ID
    and  i.uNSID is not null
    )
WHEN MATCHED THEN

    UPDATE SET ug.gNSID = i.gNSID
        ,   ug.gAlias = isnull(i.gAlias,ug.gAlias) 
        ,   ug.last_ud = GETDATE ( )


 WHEN NOT MATCHED THEN  
    --      UPDATE SET @i += 1;
        INSERT (uNSID
            ,   gNSID
            ,   gAlias
            ,   Prime_ID
            ,   Last_UD
                )
                VALUES (i.uNSID
            ,   i.gNSID
            ,   i.gAlias
            ,   i.Prime_ID
            ,   GETDATE ( )
                )
            OUTPUT
            $ACTION
            INTO @RowCounts ;

    SELECT  @InsertCount = [INSERT] ,
            @UpdateCount = [UPDATE]
    FROM    ( SELECT    MergeAction ,
                        1 AS ROWS
              FROM      @RowCounts
            ) P PIVOT
    ( COUNT(ROWS) FOR MergeAction IN ( [INSERT], [UPDATE] ) ) AS PVT ;
于 2013-01-26T02:39:48.600 に答える
1

Microsoftからは、条項and i.uNSID is not nullから自分を削除し、ON条項に残しておく必要がありますWHENWHENそのため、エラーを解決するには、他の句に追加する必要があると思います。

WHEN NOT MATCHED and i.uNSID is not null THEN  

そしてここにMSからの関連するメモのいくつかがあります:

ソーステーブルとターゲットテーブルのデータを照合するための基準を決定するON句の検索条件のみを指定します。つまり、ソーステーブルの対応する列と比較されるターゲットテーブルの列のみを指定します。

適切なWHEN句で行フィルタリングの検索条件を指定します。たとえば、WHEN NOT MATCHED AND S.EmployeeName LIKE'S%' THENINSERT...。

フィルタリングされた行を返すソースまたはターゲットのビューを定義し、そのビューをソースまたはターゲットのテーブルとして参照します。ビューがターゲットテーブルで定義されている場合、それに対するアクションはすべて、ビューを更新するための条件を満たす必要があります。ビューを使用してデータを更新する方法の詳細については、「ビューを介したデータの変更」を参照してください。

それでも問題が解決しない場合、彼らのサイトでの別の提案は、テーブルの代わりにビューを使用し、そこにNULL基準を追加することです。

お役に立てれば。

幸運を。

于 2013-01-26T02:25:38.770 に答える