Sql server MERGE一直试图插入null

Sql server MERGE一直试图插入null,sql-server,sql-server-2012-express,Sql Server,Sql Server 2012 Express,当我运行此功能时,我不断得到: Msg 515,16级,状态2,第8行 无法将值NULL插入表“Flickr.dbo.User_Grps”的列“uNSID”;列不允许空值。更新失败。 声明已终止 这是我的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 i

当我运行此功能时,我不断得到:

Msg 515,16级,状态2,第8行
无法将值NULL插入表“Flickr.dbo.User_Grps”的列“uNSID”;列不允许空值。更新失败。
声明已终止

这是我的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
我需要做什么来阻止它吸入空记录

另外,我如何配置计数器,以便在最后获得更新的x、xxx记录和添加的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,第14级,状态1,第13行违反主键约束“PK\u User\u Grps”。无法在对象“dbo.User\u Grps”中插入重复键。重复的键值为(GT10464608)

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

WHEN NOT MATCHED and i.uNSID is not null THEN  
以下是MS的一些相关注释:

仅在“打开”对话框中指定搜索条件 子句,该子句确定在源和 目标表。也就是说,只指定目标表中的列 与源表的相应列进行比较

在适当的时间段中指定行筛选的搜索条件 条款例如,如果不匹配,则S.EmployeeName类似于“S%” 然后插入

在源或目标上定义一个返回筛选行的视图 并将该视图作为源表或目标表引用。如果视图是 在目标表上定义,对其执行的任何操作都必须满足 更新视图的条件。有关更新的详细信息,请参阅 通过使用视图修改数据,请参见通过视图修改数据

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

希望这有帮助

祝您好运。

从中,您应该从您的
ON
子句中删除您的
,并且i.uNSID不为null
,并将其保留在
WHEN
子句中。这导致我假设您需要将其添加到其他
WHEN
子句中以解决错误:

WHEN NOT MATCHED and i.uNSID is not null THEN  
以下是MS的一些相关注释:

仅在“打开”对话框中指定搜索条件 子句,该子句确定在源和 目标表。也就是说,只指定目标表中的列 与源表的相应列进行比较

在适当的时间段中指定行筛选的搜索条件 条款例如,如果不匹配,则S.EmployeeName类似于“S%” 然后插入

在源或目标上定义一个返回筛选行的视图 并将该视图作为源表或目标表引用。如果视图是 在目标表上定义,对其执行的任何操作都必须满足 更新视图的条件。有关更新的详细信息,请参阅 通过使用视图修改数据,请参见通过视图修改数据

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

希望这有帮助


祝你好运。

从更新中删除你已经匹配的字段,因为它们已经是相同的,所以没有必要这样做

您可以在前面添加类似的内容:

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子句的更多信息的链接

整个谢邦:

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 ;

从更新中删除您已经匹配的字段,没有必要这样做,因为它们已经是相同的

您可以在前面添加类似的内容:

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子句的更多信息的链接

整个谢邦:

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 ;

谢谢你的帮助,但它仍在欺骗我。另外,我不知道如何合并你给我的计数器。请参阅我对原始帖子的添加。从输出部分到语句终止符必须作为合并语句的一部分包含,因为输出子句是合并的一部分。我将用你的问题修正我的答案。如果您收到重复的PK错误,那么PK中必须包含一个匹配的字段(可能是gNSID?)。如果是复合键,请确保所有相关字段都匹配,以确定要更新的内容和要插入的内容。希望这将是此线程上的最后一个愚蠢问题(不保证!:)我应该打印什么()才能获得输出??“@InsertCount”和“@UpdateCount”中的数字,您可以按自己的意愿打印、选择或插入到另一个表中。请记住,变量的作用域是批处理级别的,因此如果您发出GO语句,那么以后将无法访问它们。'PRINT N'此运行添加了'+(cast(@InsertCount as nvarchar(6)))+'记录并更新了'+(cast(@UpdateCount as nvarchar(6)))+'其他'+N'天哪,成功了谢谢你的帮助,但它仍在欺骗我。另外,我不知道如何合并你给我的计数器。请参阅我对原始帖子的添加。从输出部分到语句终止符必须作为合并语句的一部分包含,因为输出子句是合并的一部分。我将用你的问题修正我的答案。如果您收到重复的PK错误,则其中一个字段