微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

插入SQL表时如何避免XML中的重复

如何解决插入SQL表时如何避免XML中的重复

注意:这是一个示例代码和场景。使用 select 语句时我不会使用 distinct。

我第一次尝试使用 XML 将 Itemcodes 上传一个空表中。

下面是XML数据

{"ProductDetails":"<Root>\r\n <ProductDetails>\r\n <ItemCode>2503902</ItemCode\r\n </ProductDetails>\r\n <ProductDetails>\r\n <ItemCode>3591948</ItemCode>\r\n </ProductDetails>\r\n <ProductDetails>\r\n <ItemCode>2503902</ItemCode\r\n </ProductDetails>\r\n</Root>"}

当我尝试插入表格时,我正在检查表格中是否存在项目代码并按如下方式插入

INSERT INTO inv_productdetails(ItemCode)                                    
 select T.N.value('(ItemCode/text())[1]','varchar(50)')          
 from @ProductDetails.nodes('Root/ProductDetails') as T(N)                                                                                                                    
 where not exists (select top 1 *  from dbo.inv_productdetails   
where                                   
ItemCode = T.N.value('(ItemCode/text())[1]','varchar(50)') );   

我没有使用任何交易或任何东西。它是一个简单的查询来插入项目代码

但我注意到当上面的代码运行时,它无法考虑不存在语句。

你能帮我解决一个问题吗。

谢谢。

解决方法

这是预期的行为。 您的 WHERE 未找到 ItemCode 2503902 和 3591948。因此总 insert 成功。 可能的解决方案

1.(首选)使 inv_productdetails.ItemCode 唯一或主键

2.如果由于某种原因无法使用首选解决方案,请重写查询。您需要在插入数据之前清理输入。

INSERT inv_productdetails(ItemCode) 
SELECT ItemCode
FROM ( 
 select distinct T.N.value('(ItemCode/text())[1]','varchar(50)')  ItemCode         
 from @ProductDetails.nodes('Root/ProductDetails') as T(N)                                                                                                                    
 except 
 select ItemCode 
 from inv_productdetails) t; 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。