当我跑步时,我会继续:
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
答案 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 ;
那会给你你的行数。
编辑:
的更多信息的链接整个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标准。
希望这有帮助。
祝你好运。