У меня есть XML-документ, содержащий детали из заявления:
<Statement>
<Id />
<Invoices>
<Invoice>
<Id />
<Date />
<AmountDue />
etc.
</Invoice>
<Invoice>
<Id />
<Date />
<AmountDue />
etc.
</Invoice>
<Invoice>
<Id />
<Date />
<AmountDue />
etc.
</Invoice>
</Invoices>
</Statement>
Это отлично работает для конкретных деталей заявления:
SET @statementId = @xml.value('(Id)[1]', 'UNIQUEIDENTIFIER');
но для этого требуется синглтон и возвращает только первое значение. Мне нужны ВСЕ значения для счетов-фактур, а не только первое, поэтому синглтон не будет работать.
Я могу получить информацию, используя операторы перекрестного применения, подобные этому:
SELECT
@statementId AS STATEMENT_ID
Id.value('.', 'uniqueidentifier') AS INVOICE_ID
Date.value('.', 'smalldatetime') AS INVOICE_DATE
Due.value('.', 'decimal') AS INVOICE_AMOUNT_DUE
FROM @xml.nodes('Statement') A(S)
cross apply S.nodes('Invoices/Invoice') B(InvoiceD)
cross apply InvoiceD.nodes('Id') C(Id)
cross apply InvoiceD.nodes('Date') D(Date)
cross apply InvoiceD.nodes('AmountDue') E(Due)
Это возвращает идентификатор, дату и сумму из каждого счета-фактуры в выписке - идеально.
Моя проблема возникает, когда я пытаюсь извлечь все детали счета. В настоящее время у меня есть семь операторов перекрестного применения, и я получил следующее сообщение:
«У процессора запросов закончились внутренние ресурсы, и он не смог создать план запроса. Это редкое событие, ожидаемое только для чрезвычайно сложных запросов или запросов, которые ссылаются на очень большое количество таблиц или разделов. Пожалуйста, упростите запрос. Если вы считаете, вы получили это сообщение по ошибке, обратитесь в службу поддержки клиентов для получения дополнительной информации».
Что я хочу сделать, так это иметь одно перекрестное применение для счета-фактуры и сузить точное поле в операторе выбора, но если я не использую '.' Я должен сделать так, чтобы оператор возвращал синглтон, и я не получаю все данные, которые мне нужны.
Я провел некоторое исследование об указании пространства имен в операторе select, но во всех примерах пространство имен устанавливается как http-адрес вместо узла в документе xml, и я еще не получил ничего, что можно было бы вернуть, используя этот подход.
Результат, который я ищу, выглядит примерно так, но с более подробной информацией о счете:
STATEMENT_ID INVOICE_ID INVOICE_DATE INVOICE_AMOUNT_DUE ...
Statement-1-Id Invoice-1-Id Invoice-1-Date Invoice-1-AmountDue ...
Statement-1-Id Invoice-2-Id Invoice-2-Date Invoice-2-AmountDue ...
Statement-1-Id Invoice-3-Id Invoice-3-Date Invoice-3-AmountDue ...
Куда мне идти отсюда?
РЕДАКТИРОВАТЬ: я удалил ненужную информацию. Моя цель здесь — получить все детали, относящиеся к счету.
*
, немного сбивают с толку. Являются ли представленные там данные отдельными элементами в XML со значениями? - person Mikael Eriksson   schedule 26.09.2012ID
как одноэлементное значение, используяInvoiceD.value('ID[1]'. ....
. - person Mikael Eriksson   schedule 26.09.2012