SQL 服务器查询名称值对
SQL Server query for name value pairs
我是使用 SQL 服务器创建 XML 文件的新手。我有 2 table; 1 个用于人,另一个用于他们的默认设置。
人 table:
ABC
DEF
设置 table:
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>
如我的评论所述,您给出的 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>
我是使用 SQL 服务器创建 XML 文件的新手。我有 2 table; 1 个用于人,另一个用于他们的默认设置。
人 table:
ABC
DEF
设置 table:
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>
如我的评论所述,您给出的 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>