2016-10-26 10 views
1

Я новичок в создании XML-файла с использованием SQL-сервера. У меня есть 2 стола; 1 для людей и других с настройками по умолчанию для них.SQL Server запрос для пар значений значений

Person стол:

ABC 
DEF 

Настройки стол:

Code   name     value   
----------------------------------------- 
Hair   Hair color   Brown     
Hair   Texture    Curly    
Shoes   Shoe size   6    
Shoes   Shoe color   White  

Как я могу создать значение пары имя, которое выглядит, как это? Когда я пытаюсь получить настройки, я получил ошибку о нескольких записях:

<PersonData> 
    <Person>ABC</Person> 
    <DefaultSettings> 
     <Code>Hair</Code> 
     <settings> 
     <name>Hair color</name> 
     <value>Brown</value> 
     </settings> 
     <settings> 
     <name>Texture</name> 
     <value>Curly</value> 
     </settings> 
     <Code>Shoes</Code> 
     <settings> 
     <name>Shoe size</name> 
     <value>6</value> 
     </settings> 
     <settings> 
     <name>Shoe color</name> 
     <value>White</value> 
     </settings> 
    </DefaultSettings> 
    </Person> 
    <Person>DEF</Person> 
    <DefaultSettings> 
     <Code>Hair</Code> 
     <settings> 
     <name>Hair color</name> 
     <value>Brown</value> 
     </settings> 
     <settings> 
     <name>Texture</name> 
     <value>Curly</value> 
     </settings> 
     <Code>Shoes</Code> 
     <settings> 
     <name>Shoe size</name> 
     <value>6</value> 
     </settings> 
     <settings> 
     <name>Shoe color</name> 
     <value>White</value> 
     </settings> 
    </DefaultSettings> 
    </Person> 
</PersonData> 
+0

вы Google "для XML Sql Server? Показать код, который вы пробовали, и сказать, почему он не работал – dfundako

+0

Это не имеет смысла. Все люди получают одинаковые настройки? Код настройки представляет собой несколько значений? –

+0

Ваш XML недопустим. Вы закрываете тег '' за именем человека, а затем снова после закрытия '/ '. Пожалуйста, восстановите свой ожидаемый результат ... – Shnugo

ответ

1

Как сказано в моем комментарии, данный XML недействителен. Следующий запрос близок к запрошенному выходу. Надеясь, что моя волшебная стеклянная колба еще работает:

DECLARE @personTable TABLE(ID INT IDENTITY, Name VARCHAR(100)); 
INSERT INTO @personTable VALUES 
('ABC'),('DEF'); 

DECLARE @defaultSettings TABLE(Code VARCHAR(100),name VARCHAR(100),value VARCHAR(100));   
INSERT INTO @defaultSettings VALUES 
('Hair','Hair color','Brown')     
,('Hair','Texture','Curly')   
,('Shoes','Shoe size','6')    
,('Shoes','Shoe color','White'); 

SELECT pd.ID AS [Person/@id] 
     ,pd.Name AS [Person/@name] 
     ,(
     SELECT ds.Code 
       ,(
       SELECT ds2.name 
         ,ds2.value 
       FROM @defaultSettings AS ds2 
       WHERE ds.Code=ds2.Code 
       FOR XML PATH('settings'),TYPE 
       ) 
     FROM @defaultSettings AS ds 
     GROUP BY ds.Code 
     FOR XML PATH(''),TYPE 
     ) AS [Person/DefaultSettings] 
FROM @personTable AS pd 
FOR XML PATH(''),ROOT ('PersonData') 

Результат

<PersonData> 
    <Person id="1" name="ABC"> 
    <DefaultSettings> 
     <Code>Hair</Code> 
     <settings> 
     <name>Hair color</name> 
     <value>Brown</value> 
     </settings> 
     <settings> 
     <name>Texture</name> 
     <value>Curly</value> 
     </settings> 
     <Code>Shoes</Code> 
     <settings> 
     <name>Shoe size</name> 
     <value>6</value> 
     </settings> 
     <settings> 
     <name>Shoe color</name> 
     <value>White</value> 
     </settings> 
    </DefaultSettings> 
    </Person> 
    <Person id="2" name="DEF"> 
    <DefaultSettings> 
     <Code>Hair</Code> 
     <settings> 
     <name>Hair color</name> 
     <value>Brown</value> 
     </settings> 
     <settings> 
     <name>Texture</name> 
     <value>Curly</value> 
     </settings> 
     <Code>Shoes</Code> 
     <settings> 
     <name>Shoe size</name> 
     <value>6</value> 
     </settings> 
     <settings> 
     <name>Shoe color</name> 
     <value>White</value> 
     </settings> 
    </DefaultSettings> 
    </Person> 
</PersonData> 
+0

Спасибо, Шнуго! я попробую это. Я знаю, что данные не имеют смысла, но это макет, чтобы быть дискретным. Мне нужно преобразовать данные в спецификации поставщика. Это часть общего числа PersonData. Может ли запрос быть включен в другой запрос? – okidog

+0

@okidog Запрос полностью * ad-hoc * и поэтому легко встраивается в другой запрос. Подумайте об этом выражении, чтобы вернуть одно скалярное значение. Просто поставьте paranthesis вокруг него и добавьте его в список столбцов select. – Shnugo

+0

Он отлично работает! Мне просто нужно выяснить, как избавиться от пространств имен. Спасибо огромное! – okidog