我有两张桌子:
表1:
IDt1 | XML
1123 xml
1457 xml
表2:
ID | Name | XML
01 A xml
02 B xml
我想在table1中搜索XML,如果数据存在,则使用IDt1并在table2 XML中搜索它(如果存在),然后从table2返回ID和Name 这是每个表的XML。
表1 xml:
<t>
<ts>
<sc>
<rn>445</rn>
<am>Name1</am>
</sc>
<sc>
<rn>555/rn>
<am>Name2</am>
</sc>
</ts>
</t>
表2 xml:
<t>
<ts>
<d>
<n>01123</n>
</d>
<d>
<n>04344</n>
</d>
</ts>
</t>
我想要的数据:
ID | Name
01 a
我能够从表1中检索包含我正在查找的内容的ID,但之后我无法使用这些ID在其他xml中进行搜索。 这就是我所拥有的:
SELECT IDt1 as table1IDs
FROM [Table1]
WHERE [XML].exist ('/t/ts/sc/am[contains(., "Name1")]') > 0
它返回一个包含Name1的ID表,现在问题是如何使用这些ID并在table2的xml中搜索它们然后返回table2的Name和ID 问题是现在我必须使用xml.exist [包含table1IDs],它不能接受变量
有办法吗?
答案 0 :(得分:0)
After several testing I think this does the job
DECLARE @searchFor NVARCHAR(max)=N'Name1'
SELECT t2.ID as ID, t2.Name as Name
FROM table1 AS t1
JOIN table2 AS t2 ON t2.xml.query(N'/t/ts/d/n').value('.', 'VARCHAR(max)') = CAST(t1.ID as varchar(max))
WHERE t1.xml.exist(N'/t/ts/sc/am[text()[1]=sql:variable("@searchFor")]')=1 order by ID
returns
ID | Name
01 a
答案 1 :(得分:0)
你的解决方案非常接近,虽然我不会使用LIKE
...你可以试试这个:
DECLARE @dummy1 TABLE(IDt1 INT, xml1 XML);
INSERT INTO @dummy1 VALUES
(1123,N'<t>
<ts>
<sc>
<rn>445</rn>
<am>Name1</am>
</sc>
<sc>
<rn>555</rn>
<am>Name2</am>
</sc>
</ts>
</t>')
,(1457,N'<t />'); --you provided only one example...
DECLARE @dummy2 TABLE(ID INT, [Name] VARCHAR(100), [XML] XML);
INSERT INTO @dummy2 VALUES
(1,'A',N'<t>
<ts>
<d>
<n>01123</n>
</d>
<d>
<n>04344</n>
</d>
</ts>
</t>')
,(2,'B',N'<t />'); --you provided only one example...
DECLARE @searchFor NVARCHAR(100)=N'Name1'
SELECT *
FROM @dummy1 AS t1
INNER JOIN @dummy2 AS t2 ON t2.[XML].exist(N'/t/ts/d/n[text()[1]=sql:column("t1.IDt1")]')=1
WHERE t1.xml1.exist(N'/t/ts/sc/am[text()[1]=sql:variable("@searchFor")]')=1