Sql server 在使用“从选择插入”之前,如何检查重复项

Sql server 在使用“从选择插入”之前,如何检查重复项,sql-server,tsql,Sql Server,Tsql,我有下面的代码从链接服务器获取数据,但是如果有skip for Next或insert from select,我如何检查sqlserver表中是否有重复记录。我想使用以下字段进行比较 [客户],[销售订单日期],[销售订单编号],[项目ID],[承诺日期],[采购订单] 您可能会发现,该语句适用于此目的。它允许您指定目标表、源查询、联接条件以及在匹配或不匹配时要执行的操作。使用与exists相关的子查询来删除已存在的行: 选择。。。从…起如果不存在,请从db1.dbo.WorkOrders中选

我有下面的代码从链接服务器获取数据,但是如果有skip for Next或insert from select,我如何检查sqlserver表中是否有重复记录。我想使用以下字段进行比较 [客户],[销售订单日期],[销售订单编号],[项目ID],[承诺日期],[采购订单]


您可能会发现,该语句适用于此目的。它允许您指定目标表、源查询、联接条件以及在匹配或不匹配时要执行的操作。

使用与exists相关的子查询来删除已存在的行:


选择。。。从…起如果不存在,请从db1.dbo.WorkOrders中选择42,其中

因为您要使用insert only所以Not exists是理想的选择,不需要太多更改

试着修正你自己的错误

insert db1.dbo.WORKORDERS 
   ([WORK ORDER #],[QUANTITY],[CUSTOMER],[SO DATE],[SO NUMBER],[ROUTING],[itemid],[CUSTOMER PN],[SHIP VIA],[PROMISED DATE],[COMMENTS],[PO #],[WO Notes])
Select 
  convert(varchar(10), next value for dbo.WorkOrderSequence ),
  Quantity,
  Customer_Bill_Name,
  TransactionDate,
  Reference,
  Category,
  ItemID,
  PartNumber,
  WhichShipVia,
  ShipByDate,
  Comment2,
  CustomerInvoiceNo,
  SalesDescription 
FROM
(
select 
x.Quantity,--
  x.Customer_Bill_Name,
  x.TransactionDate,
  x.Reference,
  X.Category,
  x.ItemID,
  x.PartNumber,
  x.WhichShipVia,
  x.ShipByDate,
  x.Comment2,
  x.CustomerInvoiceNo,
  x.SalesDescription
from
  openquery
  ([DB29],
    'select              
        Customers.Customer_Bill_Name,
        JrnlHdr.TransactionDate,
       Cast(JrnlRow.Quantity as Decimal(38,0)) as Quantity,
        JrnlHdr.Reference, 
        LineItem.Category,
       LineItem.ItemID ,
        LineItem.PartNumber, 
        Customers.WhichShipVia, 
        JrnlHdr.ShipByDate, 
        JrnlHdr.Comment2,
        JrnlHdr.CustomerInvoiceNo, 
        LineItem.SalesDescription    
FROM   Customers
    INNER JOIN JrnlHdr
ON Customers.CustomerRecordNumber = JrnlHdr.CustVendId
    LEFT OUTER JOIN Address
ON Customers.CustomerRecordNumber = Address.CustomerRecordNumber
    INNER JOIN JrnlRow
ON JrnlHdr.PostOrder = JrnlRow.PostOrder
    INNER JOIN LineItem 
ON JrnlRow.ItemRecordNumber = LineItem.ItemRecordNumber
WHERE  JrnlHdr.JrnlKey_Journal = 11 AND JrnlHdr.TransactionDate = CURDATE()
AND JrnlHdr.PostOrder = JrnlRow.PostOrder  
AND JrnlHdr.CustVendId = Customers.CustomerRecordNumber 
AND JrnlRow.ItemRecordNumber = LineItem.ItemRecordNumber 
AND JrnlHdr.POSOisClosed = 0

)  as x'
)t4
where not exists(
select 1 from db1.dbo.WORKORDERS WO where wo.[CUSTOMER]=t4.Customer_Bill_Name
and [SO DATE]=t4.TransactionDate AND[SO NUMBER]=t4.Reference 
AND[itemid]=t4.ItemID and [PROMISED DATE]=t4.ShipByDate and [PO #]=t4.[PO #]
)
您可以使用:

这将为您提供链接服务器上不存在的记录:

SELECT [CUSTOMER],[SO DATE],[SO NUMBER],[itemid],[PROMISED DATE],[PO #]
FROM current_database
EXCEPT
SELECT [CUSTOMER],[SO DATE],[SO NUMBER],[itemid],[PROMISED DATE],[PO #]
FROM linked_server_current_database
这将为您提供当前服务器上不存在的记录:

SELECT [CUSTOMER],[SO DATE],[SO NUMBER],[itemid],[PROMISED DATE],[PO #]
FROM  linked_server_current_database
EXCEPT
SELECT [CUSTOMER],[SO DATE],[SO NUMBER],[itemid],[PROMISED DATE],[PO #]
FROM current_database

我收到了以下错误消息:Msg 11719,级别15,状态1,第20行检查约束、默认对象、计算列、视图、用户定义函数、用户定义聚合、用户定义表类型、子查询、公共表表达式、派生表或返回语句中不允许函数的下一个值。任何想法[工单]都是使用序列函数创建的,这是错误的原因吗?我怎样才能修好它?非常感谢。是,在任何情况下,在内部选择中都不需要序列。即使问题没有解决。现在检查我的查询添加了一条记录6次否这是不可能的。请注释插入表名并仅验证选择结果集。问题仅存在于连接列名中不存在的位置。如何调试?我只说如果使用where,则可能不需要Distinctnot子句不正确,因为distinct是邪恶的。在您的情况下,可能会得到无法修复的重复数据。首先,您应该定义在您的情况下什么是重复记录,即所有列的组合。然后在where条件下使用相同的列
SELECT [CUSTOMER],[SO DATE],[SO NUMBER],[itemid],[PROMISED DATE],[PO #]
FROM  linked_server_current_database
EXCEPT
SELECT [CUSTOMER],[SO DATE],[SO NUMBER],[itemid],[PROMISED DATE],[PO #]
FROM current_database