SQL Server 2012:在检查重复项时将数据插入表中

时间:2015-03-20 22:16:25

标签: sql-server sql-server-2012 excel-2010

我编写了一个查询,用于将数据从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子句。

任何建议都将不胜感激。

3 个答案:

答案 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'