Просто глядя на мое поле XML, мои строки выглядят так:
<person><firstName>Jon</firstName><lastName>Johnson</lastName></person>
<person><firstName>Kathy</firstName><lastName>Carter</lastName></person>
<person><firstName>Bob</firstName><lastName>Burns</lastName></person>
Обратите внимание, что это три строки в моей таблице.
Я хотел бы вернуть результат SQL в виде таблицы, как в
Jon | Johnson
Kathy| Carter
Bob | Burns
Какой запрос выполнит это?
sql-server
xml
xpath
Larsenal
источник
источник
Ответы:
Учитывая, что поле XML называется xmlField ...
источник
The XQuery syntax '/function()' is not supported.
:; С другой стороны, @Remus Rusanu, кажется, делает это :)<BAM><Type>Electrical</Type><BaIds><a:int>7330</a:int></BaIds></BAM>
мой выборselect e.MessageData.value('(/BAM/Type)[1]', 'varchar(100)')
. Я также пробовал выбратьe.MessageData.value('(/BAM/Type/node())[1]', 'varchar(100)')
, и'(//Type/node())[1]'
,'(./Type)[1]'
и все другие комбинации, которые я мог придумать. Все, что я когда-либо получал, этоNULL
.Учитывая, что данные XML поступают из таблицы 'table' и хранятся в столбце 'field': используйте методы XML , извлекайте значения с помощью
xml.value()
, узлы проекта с помощьюxml.nodes()
, используйтеCROSS APPLY
для объединения:Вы можете отказаться от
nodes()
и,cross apply
если каждое поле содержит ровно один элемент «человек». Если XML - это переменная, которую вы выбираете,FROM @variable.nodes(...)
и вам не нуженcross apply
.источник
Этот пост был полезен для решения моей проблемы, которая имеет немного другой формат XML ... мой XML содержит список ключей, как в следующем примере, и я храню XML в столбце SourceKeys в таблице с именем DeleteBatch:
Создайте таблицу и заполните ее некоторыми данными:
Вот мой SQL для выбора ключей из XML:
Вот результаты запроса ...
источник
Это может ответить на ваш вопрос:
источник
Вот это да. Это было действительно полезное обсуждение.
Некоторые из этих предложений все еще меня сбивают с толку. Всякий раз , когда я
value
с[1]
в строке, было бы только извлечет первое значение. И несколько советов, рекомендованных использоватьcross apply
которые (в моих тестах) просто вернули слишком много данных.Итак, вот мой простой пример того, как вы создаете
xml
объект, а затем считываете его значения в таблицу.И вот результат:
Это странный синтаксис, но на достойном примере его достаточно легко добавить к вашим собственным функциям SQL Server.
Кстати, вот правильный ответ на этот вопрос.
Предполагая, что у вас есть XML-данные в
@xml
переменной типаxml
(как показано в моем примере выше), вот как вы вернете три строки данных из xml, указанных в вопросе:источник
[1]
порядковый номер индекса, чтобы заставить его возвращать 1 строку, либо вам нужно перекрестно применить столбец,nodes()
чтобы получить структура, против которой может работать xpath. Ваш код не соответствует этому сценарию без множества изменений. Вы используете переменную, а не столбец таблицы. Вы также злоупотребляетеquery()
функцией, которая возвращает xml. например, вы могли бы простоx.Rec.value('(./firstName)[1]', 'nvarchar(2000)') AS FirstName
Если вы можете заключить свой XML в корневой элемент - скажем, ваше решение - следующее:
источник
MSSQL использует обычные правила XPath следующим образом:
W3Schools
источник
источник
/ * В этом примере используется переменная XML со схемой * /
источник