2016-09-22 5 views
0

Мне нужно вернуть псевдоним столбца, в котором есть пробелы в XML из SQL Server. XML должен был бы выглядеть следующим образом:SQL Server: укажите имя столбца как атрибут и значение узла FOR XML

<Records> 
    <Record> 
     <Field FieldName="PURCHASE_DETAIL_ID">31320</Field> 
     <Field FieldName="ORDER_ID">6507</Field> 
     <Field FieldName="PRODUCT_ORDER">1</Field> 
    </Record> 
</Records> 

Моя таблица выглядит следующим образом:

PURCHASE_DETAIL_ID | ORDER_ID | PRODUCT_ORDER 
---------------------------------------------------- 
    31320    6507    1 

Я хотел бы использовать FOR XML метод извлечения XML.

Я пробовал следующее, он отлично работает для одного столбца, но не для нескольких.

SELECT 
    'PURCHASE_DETAIL_ID' AS [Field/@FieldName], 
    'GOLI' + RTRIM(CONVERT(VARCHAR(10), ol.ID)) AS [Field], 
    'ORDER_ID' AS [Field/@FieldName], 
    o.ID AS [Field], 
    'PRODUCT_ID' AS [Field/@FieldName], 
    P.ID AS [Field] 
FROM ... 
WHERE ... 
FOR XML PATH('Record'), ROOT('Records') 

ответ

1

Это то, что вам нужно сделать ...

SELECT 
    'PURCHASE_DETAIL_ID' AS [Field/@FieldName], 
    'GOLI' + RTRIM(CONVERT(VARCHAR(10), ol.ID)) AS [Field], 
'', 
    'ORDER_ID' AS [Field/@FieldName], 
    o.ID AS [Field], 
'', 
    'PRODUCT_ID' AS [Field/@FieldName], 
    P.ID AS [Field] 
FROM ... 
WHERE ... 
FOR XML PATH('Record'), ROOT('Records') 
+0

'' это новая вещь, которую вы здесь ... –

1

Вы можете попробовать использовать значение XML-узлов, как показано ниже:

declare @xml xml = 
'<Records> 
    <Record> 
     <Field FieldName="PURCHASE_DETAIL_ID">31320</Field> 
     <Field FieldName="ORDER_ID">6507</Field> 
     <Field FieldName="PRODUCT_ORDER">1</Field> 
    </Record> 
</Records>' 

;with cte as (
SELECT T.c.value('@FieldName', 'nvarchar(max)') AS result, T.c.value('.','int') as val 
FROM @xml.nodes('/Records/Record/Field') T(c) 
) 
select * from cte 
pivot (max(val) for result in ([PURCHASE_DETAIL_ID],[ORDER_ID],[PRODUCT_ORDER])) p 

Вывод будет выглядеть следующим образом:

enter image description here

Если вы хотите, чтобы получить результаты в строке мудрая вам может выполнить запрос внутри только cte

SELECT T.c.value('@FieldName', 'nvarchar(max)') AS result, T.c.value('.','int') as val 
FROM @xml.nodes('/Records/Record/Field') T(c) 

это будет работать

+0

я хочу сделать обратный –

+0

Reverse означает, что вы можете выполнить запрос внутри КТР будет работать ВЫБЕРИТЕ Tcvalue (» @FieldName ',' nvarchar (max) ') Результат AS, Tcvalue ('. ',' Int ') как val FROM @ xml.nodes ('/Records/Record/Field ') T (c) –

+0

Обновленный ответ на основе вашего комментария –

 Смежные вопросы

  • Нет связанных вопросов^_^