SQL Server动态XQuery

时间:2014-09-16 10:42:52

标签: sql sql-server xquery-sql

我试图将数据从XML(存储为NText)中提取到SQL表中。

假设我们有两个表,每个表都有XML:

|          TABLE 1          |         |     TABLE 2    |
|ID| NAME  |FIELD_DEFINITION|         |ID|DEF_ID|VALUES|
|1 |FIELD 1|     <XML1>     |         |1 |   1  |<XML2>|
|---------------------------|         |----------------|

假设XML1的第1行和第2行看起来像这样:

ROW 1
-----
<def>
    <prop name="Property 1" pdid="1"/>
    <prop name="Property 2" pdid="2"/>
</def>

ROW 2
-----
<def>
    <prop name="Property 1" pdid="3"/>
    <prop name="Property 2" pdid="4"/>
</def>

XML2看起来像这样:

ROW 1
-----
<ps>
    <p pdid="1" pvalue="Value 1"/>
    <p pdid="2" pvalue="Value 2"/>
</ps>

ROW 2
-----
<ps>
    <p pdid="3" pvalue="Value 3"/>
    <p pdid="4" pvalue="Value 4"/>
</ps>

我试图获取名为&#34;属性1和#34;的任何属性的所有值。但是XML的定义表示值存储在表1中的位置,值存储在表2中。

我正在获取表1中每个条目的属性1字段的pdid,如下所示:

SELECT
    t1.ID, t1.NAME,
    CAST(t1.FIELD_DEFINITION AS XML).value('(/def/prop[@name = "Property 1"]/@pdid)[1]','varchar(10)') as FIELD_ID
FROM
    [Table 1] t1

但是,我现在如何将该pdid值传递给XQuery以从表2中提取pvalue?我希望我可以执行上述操作,并将表2连接到t1.ID = t2.DEF_ID上的表1,然后将cp.FIELD_ID传递给t2.VALUES.value()上的XQuery。

这可能吗?或者我在这里采取了错误的做法?

1 个答案:

答案 0 :(得分:0)

经过多次头脑冲击(以及“重新分配”我的时间远离其他工作),我已经设法做到了,我会在这里发帖给任何感兴趣的人。

SELECT
    t1.ID AS T1_ID, t1.NAME, t2.ID AS T2_ID,
    CAST(CAST(t1.FIELD_DEFINITION AS NVARCHAR(MAX)) + CAST(t2.VALUES AS NVARCHAR(MAX)) AS XML).value
    ('for $d in (/def/prop[@name = "Property 1"]/@pdid)[1] return (/ps/p[@pdid = $d]/@pvalue)[1]','varchar(50)') as VAL
FROM
    [Table 1] t1 INNER JOIN
    [Table 2] t2 ON t1.ID = t2.DEF_ID

好老的FLWOR来救援。在SQL中使用XML永远不会很快(在我的情况下返回1000行约6秒)但是它完成了工作!