Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对带有标记属性的XML的SQL查询_Sql_Sql Server_Xml - Fatal编程技术网

对带有标记属性的XML的SQL查询

对带有标记属性的XML的SQL查询,sql,sql-server,xml,Sql,Sql Server,Xml,有一张桌子: CREATE TABLE temp (ID int, name varchar(50)); INSERT INTO temp ([ID], [name]) VALUES (1, 'Value 1'), (2, 'Value 2'); 需要SQL查询返回以下结果: <root> <row> <param name="first">1</param> <param name="secon

有一张桌子:

CREATE TABLE temp
    (ID int, name varchar(50));

INSERT INTO temp
    ([ID], [name])
VALUES
    (1, 'Value 1'),
    (2, 'Value 2');
需要SQL查询返回以下结果:

<root>
 <row>
  <param name="first">1</param>
  <param name="second">Value 1</param>
 </row>
 <row>
  <param name="first">2</param>
  <param name="second">Value 2</param>
 </row>
</root>
请更正查询以使其正常工作。

SQL

输出

XQuery FLWOR表达式为您提供了对XML形状的完全控制。请查看:

SQL

输出


您可以通过子查询实现这一点:

SELECT  'first' as [param/@name],
        ID as [param],
        (SELECT 'second' as [param/@name], 
                name as [param] 
        FROM temp t1 WHERE t1.ID = t.ID 
        FOR XML PATH(''), TYPE )  
FROM temp t
FOR XML PATH('row'), root('root')
输出:

<root>
  <row>
    <param name="first">1</param>
    <param name="second">Value 1</param>
  </row>
  <row>
    <param name="first">2</param>
    <param name="second">Value 2</param>
  </row>
</root>

您可以通过子查询实现这一点:

SELECT  'first' as [param/@name],
        ID as [param],
        (SELECT 'second' as [param/@name], 
                name as [param] 
        FROM temp t1 WHERE t1.ID = t.ID 
        FOR XML PATH(''), TYPE )  
FROM temp t
FOR XML PATH('row'), root('root')
输出:

<root>
  <row>
    <param name="first">1</param>
    <param name="second">Value 1</param>
  </row>
  <row>
    <param name="first">2</param>
    <param name="second">Value 2</param>
  </row>
</root>

最简单的方法可能是:

SELECT  'first' as [param/@name]
        ,ID as [param]
        ,''
        ,'second' as [param/@name]
        ,[name] as [param] 
FROM temp t
FOR XML PATH('row'), root('root');
简而言之:

引擎沿列向下运行并找到

我们必须开一家银行 我们必须为每一行打开一个窗口 好的,第一列是新元素,我们必须打开它。 现在,首先必须将该值写入属性@name。 下一个值ID也存在于中,它仍处于打开状态。将其添加为文本节点。 那么下一列是-嗯-空的???然而首先我们必须关闭开放的。。。 好的,下一个专栏看起来更好。有一个元素。。。好的,最后一个已经关闭了,我们必须打开一个新的

等等

这也适用于路径片段:

SELECT  'first' as [param/onemore/@name]
        ,ID as [param/onemore]
        ,'' AS [param]
        ,'second' as [param/onemore/@name]
        ,[name] as [param/onemore] 
FROM temp t
FOR XML PATH('row'), root('root');
结果

<root>
  <row>
    <param>
      <onemore name="first">1</onemore>
      <onemore name="second">Value 1</onemore>
    </param>
  </row>
  <row>
    <param>
      <onemore name="first">2</onemore>
      <onemore name="second">Value 2</onemore>
    </param>
  </row>
</root>

在这种情况下,我们是开放的,但我们保持开放。

最简单的方法可能是:

SELECT  'first' as [param/@name]
        ,ID as [param]
        ,''
        ,'second' as [param/@name]
        ,[name] as [param] 
FROM temp t
FOR XML PATH('row'), root('root');
简而言之:

引擎沿列向下运行并找到

我们必须开一家银行 我们必须为每一行打开一个窗口 好的,第一列是新元素,我们必须打开它。 现在,首先必须将该值写入属性@name。 下一个值ID也存在于中,它仍处于打开状态。将其添加为文本节点。 那么下一列是-嗯-空的???然而首先我们必须关闭开放的。。。 好的,下一个专栏看起来更好。有一个元素。。。好的,最后一个已经关闭了,我们必须打开一个新的

等等

这也适用于路径片段:

SELECT  'first' as [param/onemore/@name]
        ,ID as [param/onemore]
        ,'' AS [param]
        ,'second' as [param/onemore/@name]
        ,[name] as [param/onemore] 
FROM temp t
FOR XML PATH('row'), root('root');
结果

<root>
  <row>
    <param>
      <onemore name="first">1</onemore>
      <onemore name="second">Value 1</onemore>
    </param>
  </row>
  <row>
    <param>
      <onemore name="first">2</onemore>
      <onemore name="second">Value 2</onemore>
    </param>
  </row>
</root>

在本例中,我们重新打开了,但我们仍保持在打开状态。

第二个片段与第一个片段完全不同。你确定吗?@YitzhakKhabinsky谢谢!更正如果建议的解决方案对您有效,请将其标记为正确的绿色检查图像。第二个片段与第一个片段完全不同。你确定吗?@YitzhakKhabinsky谢谢!正确如果建议的解决方案适合您,请将其标记为正确的绿色复选框图像。这正是所需的!谢谢!伊扎克,我想,这可以说得更简单。。。我只是自己写了一个答案…正是我所需要的!谢谢!伊扎克,我想,这可以说得更简单。。。我刚刚给了自己一个答案…好答案,+1来自我这边!有第二个解决方案总是很好的。这可以做得更简单,我只是放了一个答案,可能对你来说很有趣…很好的答案,+1来自我这边!有第二个解决方案总是很好的。这可以做得更简单,我只是放置了一个答案,可能对你们来说很有趣…奇怪,我从你们的答案开始尝试了相同的查询,但它不起作用。。。所以我提出了一个w/子查询:回答得很好,+1来自我这边!谢谢你的详细解释。奇怪的是,我从你回答的开始就尝试了同样的问题,但没有成功。。。所以我提出了一个w/子查询:回答得很好,+1来自我这边!谢谢你的详细解释。