1

当我运行它时,我不断得到:

消息 515,级别 16,状态 2,第 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
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

整个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 ;
于 2013-01-26T02:39:48.600 回答
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%' THEN INSERT....

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

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

希望这可以帮助。

祝你好运。

于 2013-01-26T02:25:38.770 回答