2016-01-07 3 views
1

У меня есть таблицаTSQL: Как выбрать строки в XML-элемент

Cost  RenderedValue SectionName 
    ------------------------------------ 
    100.00  1000.00   Section1 
    200.00  2000.00   Section2 
    300.00  3000.00   Section3 
    400.00  4000.00   Section4 

, и я хочу, чтобы произвести этот XML:

<Root> 
    <Section1Cost>100.00</Section1Cost> 
    <Section1RenderedValue>1000.00</Section1RenderedValue> 
    <Section2Cost>200.00</Section2Cost> 
    <Section2RendredValue>2000.00</Section2RendredValue> 
</Root> 

я был в состоянии произвести его с помощью TSQL (Test мое имя таблицы)

SELECT 
    (SELECT Cost AS 'Cost'FROM Test WHERE SectionName = 'Section1') AS 'Section1Cost', 
    (SELECT RenderedValue AS 'Cost'FROM Test WHERE SectionName = 'Section1') AS 'Section1RenderedValue', 
    (SELECT Cost AS 'Cost'FROM Test WHERE SectionName = 'Section2') AS 'Section2Cost', 
    (SELECT RenderedValue AS 'Cost'FROM Test WHERE SectionName = 'Section2') AS 'Section2RendredValue' 
FOR XML Path(''), Root('Root') 

Но это уродливо, и я думаю, что он не оптимизирован. Может ли быть более элегантным, или что у меня есть, правильно?

я, возможно, не более 30 строк в этой тестовой таблице

+0

Пожалуйста, быть в курсе о том,, что все специалисты, дающие ответы на SO голодны для очков репутации. [Пожалуйста, прочтите это: кто-то-ответы] (http://stackoverflow.com/help/someone-answers). Было бы неплохо также взглянуть на ваши старые вопросы. Спасибо! – Shnugo

ответ

0

Это дает вам XML, которые слегка отличаются (используя тег раздела), но SQL скрипт должен быть более эффективным:

SELECT 
    Test.SectionName AS [@SectionName], 
    Test.Cost AS [Cost], 
    Test.RenderedValue AS [RenderedValue] 

FROM Test 
ORDER BY Test.SectionName 
FOR XML PATH ('Section'), ROOT('Sections'); 

Этих это выход из этого сценария для таблицы выборки вы предоставили:

<Sections><Section SectionName="Section1"><Cost>100.0000</Cost><RenderedValue>1000.0000</RenderedValue></Section><Section SectionName="Section2"><Cost>200.0000</Cost><RenderedValue>2000.0000</RenderedValue></Section><Section SectionName="Section3"><Cost>300.0000</Cost><RenderedValue>3000.0000</RenderedValue></Section><Section SectionName="Section4"><Cost>400.0000</Cost><RenderedValue>4000.0000</RenderedValue></Section></Sections> 
+0

Нет, это не то, что я ищу. Я не могу изменить структуру xml. – LP13

0

Я думаю, что я получил его

EDIT1

Я хочу вернуть то, что я сказал, решение, о котором я говорил, не работает точно так, как я хочу. Если запись не существует Я хочу напечатать 0. Таким образом, если модифицировать над ним не работал

select 
case when t.sectionname = 'section1' then t.cost else 0 end as 'section1cost', 
case when t.sectionname = 'section1' then t.renderedvalue else 0 end as 'section1rendervalue' 
from test t 
for xml path(''),root('root') 
+0

Но это не будет динамически назвать теги XML для вас, как в разделе 1, section2 и т. Д., Или это не нужно? –

+0

нет элемента xml, и имя элемента основано на имени раздела – LP13

+0

Спасибо за комментарий. Я думаю, у меня есть точное решение, в котором вы нуждаетесь. См. Мой последний ответ. –

0

Привет здесь измененная версия моего предыдущего ответа на основе вашего последнего ответа user3862378

DECLARE @sql varchar(max) = '' 
DECLARE @case VARCHAR(MAX) = '' 

SELECT @case += 'case when t.sectionname = '''+SectionName+''' then t.cost end as '''+SectionName+'Cost'', 
case when t.sectionname = '''+SectionName+''' then t.renderedvalue end as '''+SectionName+'RenderedValue'',' 

    FROM <YOUR TABLE NAME> 

    SELECT @sql = 'select '+ SUBSTRING(@case,1,LEN(@case)-1) +'from <YOUR TABLE NAME> t 
for xml path(''''),root(''root'')' 

EXECUTE (@sql) 

И вот результаты:

<root> 
    <Section1Cost>100.00</Section1Cost> 
    <Section1RenderedValue>1000.00</Section1RenderedValue> 
    <Section2Cost>200.00</Section2Cost> 
    <Section2RenderedValue>2000.00</Section2RenderedValue> 
    <Section3Cost>300.00</Section3Cost> 
    <Section3RenderedValue>3000.00</Section3RenderedValue> 
    <Section4Cost>400.00</Section4Cost> 
    <Section4RenderedValue>4000.00</Section4RenderedValue> 
</root> 
+0

Это должно динамически создавать каждый элемент с именами на основе значений в столбце SectionName. –

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