我编写了一个查询,用于将数据从Excel插入到SQL Server表中,我需要添加以检查并查看该信息是否已存在于表中。当我添加WHERE
子句来检查表以查看我要插入的数据是否真的是新的时,它将不会添加任何数据,即使它是新的。
这是我的代码:
CREATE TABLE #Master
(
BrNBr varchar(10),
BranchName varchar(100),
Region varchar(100),
Marketplace varchar(100),
Enumber varchar(120),
Fname varchar(100),
Lname varchar(100),
SBSLFName varchar(100),
SBL varchar(100),
Title varchar(100),
Status varchar(100),
StartDate int
);
INSERT INTO #Master (BrNbr, BranchName, Region, Marketplace, Enumber, Fname, Lname, SBSLFName, SBL, Title, Status, StartDate)
VALUES ('TT000', 'Test1', 'Test2', 'Test3', 'T77777', 'Test4', 'Test5', 'Test6', 'Test7', 'SBS', 'A', '42005');
INSERT INTO dbo.tbSBSTest
SELECT DISTINCT
BrNbr,
BranchName,
Region,
Marketplace,
Enumber,
Fname,
Lname,
SBSLFName,
SBL,
Title,
Status,
CONVERT(int, StartDate, 102) AS Startdate,
NULL AS Termdate
FROM
#Master
WHERE
Enumber NOT IN (SELECT DISTINCT Enumber FROM dbo.tbSBSTest);
DROP TABLE #Master
SELECT *
FROM dbo.tbSBSTest
WHERE BranchName = 'Test1';
原谅格式化 - 它是由Excel编写的。唯一标识符是Enumber
。如果我注释掉WHERE
子句,它将更新,但不会使用WHERE
子句。
任何建议都将不胜感激。
答案 0 :(得分:2)
无需检查WHERE
,数据库引擎本身提供了检查重复项,UNIQUE
约束,索引和主键的机制。您需要在目标表上创建此类约束,然后它将自动(并且更有效地)基于一组列拒绝重复记录。您可以将约束添加到现有表中,如下所示:
ALTER TABLE [dbo].[tbSBSTest] ADD CONSTRAINT UQ_tbSBSTest_Enumber UNIQUE(Enumber) ;
这将导致包含重复的 enumber 列的任何INSERT
被拒绝。这当然可以防止重复,但副作用是整个批次被拒绝而不仅仅是重复的批次。这种情况的另一个选择,所以你可以使用与以前完全相同的代码,就是使用鲜为人知的 ignore_dup_key 索引选项:
ALTER TABLE [dbo].[tbSBSTest] ADD CONSTRAINT UQ_tbSBSTest_Enumber UNIQUE(Enumber) WITH (IGNORE_DUP_KEY=ON) ;
这会导致SQL Server以静默方式忽略那些具有已存在的编号值的行,但除此之外,请高兴地接受所有其他行。这篇文章更详细地介绍了http://web.archive.org/web/20180404165346/http://sqlblog.com:80/blogs/paul_white/archive/2013/02/01/a-creative-use-of-ignore-dup-key.aspx。
请注意,它也没有副作用,请看这里Why would you NOT set IGNORE_DUP_KEY to ON?
答案 1 :(得分:1)
尝试使用exists条件,而不是:
SELECT DISTINCT M.BrNbr, M.BranchName, M.Region...
FROM #Master AS M
WHERE NOT EXISTS(SELECT T.Enumber FROM Database.dbo.tbSBSTest AS T WHERE T.Enumber = M.Enumber)
答案 2 :(得分:0)
或使用左外连接。如果Enumber不是唯一的,它将允许您加入多个列
CREATE TABLE #Master ( BrNBr VARCHAR (10) ,BranchName VARCHAR (100) ,
Region VARCHAR (100) ,Marketplace VARCHAR (100),
Enumber VARCHAR (120) ,Fname VARCHAR (100) ,Lname VARCHAR (100) ,
SBSLFName VARCHAR (100) ,SBL VARCHAR (100) ,
Title VARCHAR (100) ,Status VARCHAR (100) ,StartDate INT)
INSERT INTO #Master (BrNbr,BranchName,Region,Marketplace,Enumber,
Fname,Lname,SBSLFName,SBL,Title,Status,StartDate)
VALUES('TT000','Test1','Test2','Test3','T77777',
'Test4','Test5','Test6','Test7','SBS','A','42005')
INSERT INTO Database.dbo.tbSBSTest
SELECT DISTINCT m.BrNbr,m.BranchName,m.Region,m.Marketplace,
m.Enumber,m.Fname,m.Lname,m.SBSLFName,m.SBL,m.Title,m.Status,
CONVERT(INT,m.StartDate,102) AS Startdate, NULL AS Termdate
FROM #Master m
LEFT OUTER JOIN Database.dbo.tbSBSTest t on t.Enumber = m.Enumber
WHERE t.Enumber IS NULL
DROP TABLE #Master
SELECT * FROM Database.dbo.tbSBSTest
WHERE BranchName = 'Test1'