如何在T-SQL中从XML获取含全值的唯一元素及XML导入求助
嘿,我来帮你搞定这个XML导入和提取唯一元素的问题!
先把XML导入SQL Server
SQL Server里导入XML有好几种实用方式,我给你列两个最常用的:
方式1:直接把XML存到变量里
如果你的XML内容不算长,直接把它赋值给一个XML类型的变量就行,后续操作起来特别顺手:
DECLARE @xml XML = N'<ROOT> <MeasuresList> <Measure ID="164"> <Names> <Name ID="1072687" langid="33"/> <Name ID="1017672" langid="13">miljoner skär</Name> </Names> </Measure> <Measure ID="362"> <Names> <Name ID="1072687" langid="33"/> <Name ID="1017672" langid="13">miljoner skär</Name> <Name ID="4068857" langid="19">hyller</Name> <Name ID="3330057" langid="18">sample text</Name> </Names> </Measure> </MeasuresList> </ROOT>';
(注:你提供的XML里最后一个<Name>标签有截断,我补了个示例文本,实际用的时候要确保XML语法完全正确哦)
方式2:从本地文件导入XML
如果你的XML存在本地文件里,用OPENROWSET就能直接读取到SQL Server里:
DECLARE @xml XML; SELECT @xml = BulkColumn FROM OPENROWSET(BULK 'C:\YourFilePath\your-xml-file.xml', SINGLE_BLOB) AS x;
提醒一下:执行这个需要你有对应的权限,而且文件路径要是服务器能访问到的路径(如果是远程服务器,得用服务器本地的路径)。
提取所有元素的唯一值
接下来就是核心需求——从所有.nodes()拆解XML,再结合去重逻辑,分两种场景给你实现:
场景1:提取唯一的属性和文本值
如果你需要把ID、langid属性和文本值拆成列,并且去重,用下面的查询:
SELECT DISTINCT NameID = NameNode.value('@ID', 'INT'), LangID = NameNode.value('@langid', 'INT'), NameText = ISNULL(NameNode.value('.', 'NVARCHAR(100)'), '') -- 处理空文本的情况 FROM @xml.nodes('/ROOT/MeasuresList/Measure/Names/Name') AS T(NameNode);
这个查询会遍历所有DISTINCT去掉重复的记录——比如你提供的XML里,ID=1072687和ID=1017672的
场景2:直接获取唯一的XML节点
要是你想直接拿到完整的、不重复的
SELECT DISTINCT NameNode.query('.') AS UniqueNameNode FROM @xml.nodes('/ROOT/MeasuresList/Measure/Names/Name') AS T(NameNode);
这样返回的结果就是每个唯一的
小提醒
- 一定要确保你的XML语法正确!你提供的原始XML里最后一个
<Name>标签有截断(langid="18...</Name>),这种情况SQL Server会解析失败,得先修正。 - 如果XML数据量特别大,可以先把拆解后的节点存到临时表,再做去重操作,性能会更好。
内容的提问来源于stack exchange,提问作者Eddie Ted Crocombe
相关产品推荐
相关产品推荐

