SQL: 如果发现重复项,如何通知用户(使用 WHERE NOT EXISTS 子句)?
SQL: How to notify user if duplicates are found (using WHERE NOT EXISTS clause)?
我正在使用存储过程用数据填充 table,并使用 WHERE NOT EXISTS
子句检查重复项。
类似于:
CREATE PROCEDURE [dbo].[spMyProcedure]
@param udtMyUserDefinedTableType
AS
BEGIN
INSERT INTO tblMyTable
SELECT
Column1, Column2, Column3, Column4, Column5
FROM @param
WHERE NOT EXISTS ( SELECT 1
FROM tblMyTable i
INNER JOIN @param o
ON i.Column1 = o.Column1
AND i.Column3 = o.Column3
AND i.Column5 = o.Column5 )
END
照原样,我的应用程序添加了数据,并跳过了重复项:good.
但我希望在跳过重复行时通知用户。
最好,确切的行。可能吗?
你不能在插入之前添加一个 SELECT
,例如:
SELECT 'Not inserted:', Column1, Column2, Column3, Column4, Column5
FROM @param AS o
WHERE EXISTS
(
SELECT 1
FROM dbo.tblMyTable AS i
WHERE i.Column1 = o.Column1
AND i.Column3 = o.Column3
AND i.Column5 = o.Column5
);
-- also the insert can be slightly simpler:
INSERT INTO dbo.tblMyTable(column list)
SELECT Column1, Column2, Column3, Column4, Column5
FROM @param AS o
WHERE NOT EXISTS ( SELECT 1
FROM dbo.tblMyTable AS i
WHERE i.Column1 = o.Column1
AND i.Column3 = o.Column3
AND i.Column5 = o.Column5 );
当然,您会希望进行错误处理并将其包装在事务中以防止竞争条件等。
我正在使用存储过程用数据填充 table,并使用 WHERE NOT EXISTS
子句检查重复项。
类似于:
CREATE PROCEDURE [dbo].[spMyProcedure]
@param udtMyUserDefinedTableType
AS
BEGIN
INSERT INTO tblMyTable
SELECT
Column1, Column2, Column3, Column4, Column5
FROM @param
WHERE NOT EXISTS ( SELECT 1
FROM tblMyTable i
INNER JOIN @param o
ON i.Column1 = o.Column1
AND i.Column3 = o.Column3
AND i.Column5 = o.Column5 )
END
照原样,我的应用程序添加了数据,并跳过了重复项:good.
但我希望在跳过重复行时通知用户。 最好,确切的行。可能吗?
你不能在插入之前添加一个 SELECT
,例如:
SELECT 'Not inserted:', Column1, Column2, Column3, Column4, Column5
FROM @param AS o
WHERE EXISTS
(
SELECT 1
FROM dbo.tblMyTable AS i
WHERE i.Column1 = o.Column1
AND i.Column3 = o.Column3
AND i.Column5 = o.Column5
);
-- also the insert can be slightly simpler:
INSERT INTO dbo.tblMyTable(column list)
SELECT Column1, Column2, Column3, Column4, Column5
FROM @param AS o
WHERE NOT EXISTS ( SELECT 1
FROM dbo.tblMyTable AS i
WHERE i.Column1 = o.Column1
AND i.Column3 = o.Column3
AND i.Column5 = o.Column5 );
当然,您会希望进行错误处理并将其包装在事务中以防止竞争条件等。