我有以下代码从链接服务器获取数据,但如果有跳过Next,我如何检查sqlserver
表中是否有重复记录,否则从select中插入。我想使用以下文件进行比较
[CUSTOMER],[SO DATE],[SO NUMBER],[itemid],[PROMISED DATE],[PO #]
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 ),
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
答案 0 :(得分:2)
使用带有exists
的相关子查询来消除已存在的行:
select ... from ... where not exists ( select 42 from db1.dbo.WorkOrders where ... )
答案 1 :(得分:1)
您可能会发现MERGE语句可用于此目的。它允许您指定目标表,源查询,连接条件以及要匹配或不匹配的操作。
答案 2 :(得分:1)
您可以使用EXCEPT:
这将为您提供链接服务器上不存在的记录:
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
答案 3 :(得分:0)
由于您只使用插入,因此不存在是理想的选择,并且不需要进行太多更改。
尝试修复自己的错误,
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 #]
)