MERGE一直试图插入null

时间:2013-01-26 01:47:38

标签: sql-server sql-server-2012-express

当我跑步时,我会继续:

  

Msg 515,Level 16,State 2,Line 8
  无法将值NULL插入列'uNSID',表'Flickr.dbo.User_Grps';列不允许空值。更新失败。
  该声明已被终止。

这是我的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

我需要做些什么才能阻止它吸入空记录?

另外,我如何配置计数器,最后我可以得到类似Updated x,xxx records & added xxx的内容?

编辑以添加--------------

@Kevin:这是我修改后的代码,因为我理解你的回答。

当我按原样运行时,我收到以下错误:

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

2 个答案:

答案 0 :(得分: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

的更多信息的链接

整个shebang:

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 ;

答案 1 :(得分:1)

Microsoft开始,您应该从and i.uNSID is not null条款中删除ON,并将其保留在WHEN条款中。这导致我假设您需要将其添加到您的其他WHEN子句以解决错误:

WHEN NOT MATCHED and i.uNSID is not null THEN  

以下是MS的一些相关说明:

  

仅在ON中指定搜索条件   确定源和中数据匹配条件的子句   目标表。也就是说,仅指定目标表中的列   与源表的相应列进行比较。

     

在适当的WHEN中指定行过滤的搜索条件   条款。例如,WHEN NOT MATCHED AND S.EmployeeName LIKE'S%'   然后插入....

     

在源或目标上定义一个返回已过滤行的视图   并将视图引用为源表或目标表。如果视图是   在目标表上定义的任何针对它的操作必须满足   更新视图的条件。有关更新的更多信息   使用视图的数据,请参阅通过视图修改数据。

如果这不能解决问题,他们网站上的另一个建议是使用View而不是表格,并在那里添加NULL标准。

希望这有帮助。

祝你好运。