使用其他XML数据在XML中搜索

时间:2017-12-08 14:39:42

标签: mysql sql sql-server xml select

我有两张桌子:

表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],它不能接受变量

有办法吗?

2 个答案:

答案 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