2014-09-16 3 views
0

Я пытаюсь извлечь данные из XML (хранятся как NText) в таблице SQL.SQL Server Dynamic XQuery

Предположим, у нас есть две таблицы, каждая из которых с XML:

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

И предположим, что строки 1 и 2 из XML1 выглядит так:

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> 

Я пытаюсь получить все значения для любых свойств с именем «Свойство 1», однако определение XML, которое обозначает, где значение хранится в таблице 1, а значения сохраняются в таблице 2.

Я получаю pdid поля Свойство 1 для каждой записи в таблице 1, например, так:

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, чтобы вывести значение pvalue из Таблицы 2? Я надеялся, что смогу сделать выше, и присоединить таблицу 2 к таблице 1 на t1.ID = t2.DEF_ID, а затем передать cp.FIELD_ID в XQuery на t2.VALUES.value().

Возможно ли это? Или я использую неправильный подход здесь?

ответ

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 пришел на помощь. Игра с XML в SQL никогда не будет быстрой (~ 6s, чтобы вернуть 1000 строк в моем случае), но она выполняет свою работу!