Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 concat в openXML  [new]
piton83
Member

Откуда:
Сообщений: 47
Всем привет!

При выполнении
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='
<ROOT>
<Customers CustomerID="VINET" ContactName="Paul Henriot">
   <Orders CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
      <Order_x0020_Details OrderID="10248" ProductID="11" Quantity="12"/>
      <Order_x0020_Details OrderID="10248" ProductID="42" Quantity="10"/>
   </Orders>
</Customers>

</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- SELECT statement that uses the OPENXML rowset provider.

SELECT    dod
FROM       OPENXML (@idoc, '/ROOT')
WITH
(
	dod nvarchar(30) 'concat(Customers/@CustomerID,Customers/@ContactName)'
)

EXEC sp_xml_removedocument @idoc

ругается - XML parsing error: Expression does not return a DOM node.

Само по себе выражение concat(Customers/@CustomerID,Customers/@ContactName) для данного xml выполняется и возвращает что требуется. Насколько я понял из сообщения об ошибке, string (результат concat) не хочет конвертиться в DOM Node.
Вопрос. Как сделать, чтобы запрос возвращал "VINETPaul Henriot", т.е. результат конкатенации двух атрибутов?
30 ноя 11, 13:12    [11682870]     Ответить | Цитировать Сообщить модератору
 Re: concat в openXML  [new]
mike909
Member

Откуда:
Сообщений: 662
piton83,

DECLARE @doc xml --varchar(1000)
select t.c.value('./@CustomerID', 'sysname') + t.c.value('./@ContactName', 'sysname')
from @doc.nodes( 'ROOT/Customers' ) as t(c) 
?
Или Вам обязательно через OPENXML хочется ?
30 ноя 11, 15:58    [11684417]     Ответить | Цитировать Сообщить модератору
 Re: concat в openXML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
И с concat всё работает:
DECLARE @doc xml = '
<Customers CustomerID="VINET" ContactName="Paul Henriot">
   <Orders CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
      <Order_x0020_Details OrderID="10248" ProductID="11" Quantity="12"/>
      <Order_x0020_Details OrderID="10248" ProductID="42" Quantity="10"/>
   </Orders>
</Customers>'

select t.c.value('concat(@CustomerID,@ContactName)', 'sysname')
from @doc.nodes( '/Customers' ) as t(c) 
Только нафиг он сдался. И смешивать ID с Name y вижу никакого смысла.
30 ноя 11, 16:16    [11684630]     Ответить | Цитировать Сообщить модератору
 Re: concat в openXML  [new]
piton83
Member

Откуда:
Сообщений: 47
mike909
piton83,

DECLARE @doc xml --varchar(1000)
select t.c.value('./@CustomerID', 'sysname') + t.c.value('./@ContactName', 'sysname')
from @doc.nodes( 'ROOT/Customers' ) as t(c) 
?
Или Вам обязательно через OPENXML хочется ?

Да, собака порылась именно в OPENXML. Дело в том, что этот запрос мне нужен не сам по себе, он генерится динамически в ходе одного из шагов работы довольно запутанной системы :) Сам запрос поменять я не могу, могу менять только XPath. Вот если бы удалось сделать такой XPath, который склеивал разные значения и скормить его OPENXML, было бы очень и очень хорошо.
30 ноя 11, 17:28    [11685236]     Ответить | Цитировать Сообщить модератору
 Re: concat в openXML  [new]
piton83
Member

Откуда:
Сообщений: 47
Mnior
И с concat всё работает:
DECLARE @doc xml = '
<Customers CustomerID="VINET" ContactName="Paul Henriot">
   <Orders CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
      <Order_x0020_Details OrderID="10248" ProductID="11" Quantity="12"/>
      <Order_x0020_Details OrderID="10248" ProductID="42" Quantity="10"/>
   </Orders>
</Customers>'

select t.c.value('concat(@CustomerID,@ContactName)', 'sysname')
from @doc.nodes( '/Customers' ) as t(c) 
Только нафиг он сдался. И смешивать ID с Name y вижу никакого смысла.

Выше ответил, зачем нужен именно такой запрос, через OpenXML - поменять запрос нельзя, можно только подставить в него другой XPath. Смешивание ID и Name само по себе смысла не несет, это просто для иллюстрации того, что мне надо. Сам пример запроса взят из MSDN, в реальной жизни в запросе получается под тысячу полей и смешивается там не ID и Name.
30 ноя 11, 17:34    [11685283]     Ответить | Цитировать Сообщить модератору
 Re: concat в openXML  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
piton83
поменять запрос нельзя
На собеседовании по получению работы, при ответе на вопрос "работает - не трогай", большие шансы её не получить.

На практике, лучше исправить "косяк" в одном месте, чем обходит его в 100500. Поддержка старого кода по боязни что-то менять превращает простую систему в комбайн, смысл которого падает ниже нуля.

Не надо в падать в крайности, рефакториг кода ради него самого убийство, но не менять - можёт ещё быстрее всё похоронить.
1 дек 11, 12:57    [11688802]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить