Разбор SQL XML с использованием значения атрибута, предоставленного другим полем в той же строке - PullRequest
0 голосов
/ 13 июня 2018

Контекст: Я собираю некоторые описания форм XML из таблицы веб-служб в надежде использовать это имя для определения того, что пользователь ввел в качестве ответа.Так как это описание изменяется для каждого шага (строки) процесса и каждого продукта, я хочу что-то, что может динамически оценивать.

Что я пробовал: Следующее было весьма полезно, но оно возвращает динамическийрезультат запроса атрибута в своем собственном поле и использование объединения для уменьшения результатов, так как одно поле приведет к собственным сложностям: Получить значения из тегов XML с динамически заданными полями данных

Текущая попытка: Я использую следующий код для создания имени атрибута, которое я буду использовать на следующем шаге для запроса значения атрибута:

case when left([Return], 5) = '<?xml' 
    then lower(cast([Return] as xml).value('(/response/form/*/@name)[1]','varchar(30)')) 
    else '' 
    end as [FormRequest]

И в качестве части шага 2 я использовалфункция STUFF, чтобы попытаться сделать возможным запрос на уровне строк

case when len(FormRequest)>0
    then stuff( ',' + 'cast([tmpFormResponse] as xml).value(''(/wrapper/@' + [FormRequest] + ')[1]'',''varchar(max)'')', 1, 1, '') 
    else '' 
    end as [FormResponse] 

Вместо того, чтобы видеть 1, возвращенный в качестве значения моего поля FormReponse для атрибута submit (см. ниже желтый цвет), он возвращает текст запроса -cast ([tmpFormResponse] как xml) .value ('(/ wrapper / @ submit) 1 ', 'varchar (max)') - вместо этого (то, что должнобыть опрошен).query result

Как мне применить метод значения, чтобы я мог динамически вырезать ответ на строку XML-данных в tmpFormResponse на основе значения поля в поле FormRequest?

Спасибо

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Вы можете проверить это:

DECLARE @xml XML=
N'<root>
<SomeAttributes a="a" b="b" c="c"/>
<SomeAttributes a="aa" b="bb" c="cc"/>
</root>';

DECLARE @localName NVARCHAR(100)='b';

SELECT sa.value(N'(./@*[local-name()=sql:variable("@localName")])[1]','nvarchar(max)')
FROM @xml.nodes(N'/root/SomeAttributes') AS A(sa) 
0 голосов
/ 14 июня 2018

Закончено взломом решения проблемы с помощью PATINDEX и CHARINDEX для поиска значения в поле [FormRequest] в поле he tmpFormResponse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...