【问题标题】:SQL Server query for name value pairsSQL Server 查询名称值对
【发布时间】:2017-03-09 05:30:15
【问题描述】:

我是使用 SQL 服务器创建 XML 文件的新手。我有 2 张桌子; 1 用于人员,其他为他们的默认设置。

人物表:

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>

【问题讨论】:

  • 你用谷歌搜索过'For XML Sql Server'吗?显示您尝试过的一些代码并说明它为什么不起作用
  • 这毫无意义。所有的人都得到相同的设置?一个设置码代表多个值?
  • 您的 XML 无效。您正在关闭人名后面的&lt;Person&gt; 标签,然后在关闭/&lt;DefaultSettings&gt; 之后再次关闭。请修复您的预期输出...

标签: sql sql-server xml tsql for-xml


【解决方案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>

【讨论】:

  • 谢谢你,Shnugo!我会试试的。我知道数据没有意义,但它是离散的模型。我必须将数据转换为供应商的规格。这是总 PersonData 的一部分。可以将查询合并到另一个查询中吗?
  • @okidog 该查询完全是ad-hoc,因此很容易合并到另一个查询中。考虑整个表达式返回一个标量值。只需在它周围加上括号并将其添加到选择的列列表中即可。
  • 效果很好!我只需要弄清楚如何摆脱命名空间。非常感谢!
  • 对不起!感谢您对此的指导。
猜你喜欢
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多