标签: for-xml

SQL FOR XML - 将数据输出为元素或属性

我正在尝试以客户指定的特定XML格式从数据库导出一些数据.我生成的XML将由第三方操纵(可能是由XSLT)来生成最终输出,但我想尽可能地将我的XML格式化为该格式.

客户要求每个产品的数据如下:

<product id="1234567890123">
    <activeState partNumber="A1234567890" shipmentDate="20110518" />
</product>
Run Code Online (Sandbox Code Playgroud)

我现有的SQL是:

SELECT SerialNo as id, 
    PartNo as partNumber,
    CONVERT(VARCHAR(8), GETDATE(), 112) AS shipmentDate, 
FROM Products
WHERE SerialNo = @SerialNo
FOR XML PATH ('product'), TYPE)
Run Code Online (Sandbox Code Playgroud)

...呈现:

<product>
  <id>100000000458</id>
  <partNumber>10004905892</partNumber>
  <shipmentDate>20120312</shipmentDate>
</product>
Run Code Online (Sandbox Code Playgroud)

我希望在XSLT中操作这些数据很容易,但纯粹作为一种智力练习,我想看看我能在SQL中走多远.我的第一个目标是简单地将id表示为产品的属性而不是作为子元素.我将要将渲染的activeState元素留给XSLT,但显然,如果我可以帮助他们的话,为什么不这样做呢......

有什么建议?

xml sql t-sql xslt for-xml

22
推荐指数
1
解决办法
2万
查看次数

TSQL:FOR XML的每行元素一行

我有一个SQL Server 2005查询生成一个大的结果集(最多几千兆字节):

SELECT * FROM Product FOR XML PATH('Product')
Run Code Online (Sandbox Code Playgroud)

运行查询会生成一个包含具有许多产品元素的文档的行:

Row 1:
<Product>
  <Name>Product One</Name>
  <Price>10.00</Price>
</Product>
<Product>
  <Name>Product Two</Name>
  <Price>20.00</Price>
</Product>
...
Run Code Online (Sandbox Code Playgroud)

我想更改查询,以便不是包含具有多个产品元素的单个文档的一行的结果集,而是返回多行,每行包含一个由单个Product元素组成的单个文档:

Row 1:
<Product>
  <Name>Product One</Name>
  <Price>10.00</Price>
</Product>

Row 2:
<Product>
  <Name>Product Two</Name>
  <Price>20.00</Price>
</Product>
Run Code Online (Sandbox Code Playgroud)

最后,我想使用IDataReader从C#中使用此查询,而不使用SQL Server或我的应用程序将整个结果集加载到内存中.我可以对SQL进行任何更改以启用此方案吗?

t-sql for-xml

13
推荐指数
1
解决办法
1万
查看次数

SQL Server 2005 For XML Explicit - 需要帮助格式化

我有一个表格,结构如下:

------------------------------
LocationID     | AccountNumber
------------------------------
long-guid-here | 12345
long-guid-here | 54321
Run Code Online (Sandbox Code Playgroud)

要传入另一个存储过程,我需要XML看起来像这样:

<root> 
    <clientID>12345</clientID>
    <clientID>54321</clientID>
</root>
Run Code Online (Sandbox Code Playgroud)

到目前为止我能做到的最好的就是这样:

<root clientID="10705"/>
Run Code Online (Sandbox Code Playgroud)

我正在使用这个SQL语句:

SELECT
    1 as tag,
    null as parent,
    AccountNumber as 'root!1!clientID'
FROM
    Location.LocationMDAccount
WHERE
    locationid = 'long-guid-here'
FOR XML EXPLICIT
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经查看了MSDN页面上的文档,但是我没有得到预期的结果.


@公斤,

你实际给了我这个输出:

<root>
  <Location.LocationMDAccount>
    <clientId>10705</clientId>
  </Location.LocationMDAccount>
</root>
Run Code Online (Sandbox Code Playgroud)

我现在要坚持FOR XML EXPLICIT克里斯莱昂.

xml sql formatting sql-server-2005 for-xml

11
推荐指数
1
解决办法
3917
查看次数

CTE和FOR XML生成嵌套XML

我在数据库中有一个邻接列表,希望通过SQL SP将XML格式的数据传递给客户端.我正在尝试使用CTE和FOR XML,但我没有让XML节点嵌套.

仅供参考,这将代表一个站点地图.

表格结构:

CREATE TABLE [dbo].[PageHierarchy](
    [ModuleId] [int] NOT NULL,
    [PageId] [int] IDENTITY(1,1) NOT NULL,
    [ParentPageId] [int] NULL,
    [PageUrl] [nvarchar](100) NULL,
    [PageTitle] [nvarchar](50) NOT NULL,
    [PageOrder] [int] NULL)
Run Code Online (Sandbox Code Playgroud)

和CTE的开始:

;WITH cte AS
(
    select * from PageHierarchy where ParentPageId is null
    union all
    select child.* from PageHierarchy child inner join cte parent on parent.PageId = child.ParentPageId
)
SELECT ModuleId, PageId, ParentPageId, PageUrl, PageTitle, PageOrder FROM cte
group by ModuleId, PageId, ParentPageId, PageUrl, PageTitle, PageOrder
order by PageOrder
for …
Run Code Online (Sandbox Code Playgroud)

xml t-sql sql-server for-xml common-table-expression

11
推荐指数
3
解决办法
9815
查看次数

在sql server中将"&lt;"和"&gt;"替换为"<"和">"

嗨,我是xml的新手

我有这样的查询

SELECT  ProjectId, 
       ProjectCode, 
       ProjectName, 
       TechId, 
      -- LocationId, 

      ( SELECT GeoId,PoliticalDivisionId ,GeographicLocationName,IsoCode,Longitude,Latitude,ParentLocationId,
       t2.CreatedBy,t2.CreatedOn,t2.LastUpdatedBy,t2.LastUpdatedOn
    FROM GeographicLocation t2
    WHERE GeoId = t1.LocationId
    FOR XML  PATH('Location') ),
       RtoId, 
       CreatedBy,
       CreatedOn,
       LastUpdatedBy,
       LastUpdatedOn
FROM Project t1
where ProjectId=1
FOR XML PATH('ProjectInfo')
Run Code Online (Sandbox Code Playgroud)

它将xml返回为

<ProjectInfo>
<ProjectId>1</ProjectId>
<ProjectCode>US-W1-00001</ProjectCode>
<ProjectName>Rees</ProjectName>
<TechId>1</TechId>
&lt;Location&gt;&lt;GeoId&gt;235&lt;/GeoId&gt;&lt;PoliticalDivisionId&gt;2&lt;/PoliticalDivisionId&gt;&lt;GeographicLocationName&gt;UNITED STATES&lt;/GeographicLocationName&gt;&lt;IsoCode&gt;US&lt;/IsoCode&gt;&lt;/Location&gt;
<RtoId>3</RtoId>
<CreatedBy>1</CreatedBy>
<CreatedOn>2013-06-30T20:55:21.587</CreatedOn>
<LastUpdatedBy>1</LastUpdatedBy>
<LastUpdatedOn>2013-06-30T20:55:21.587</LastUpdatedOn>
Run Code Online (Sandbox Code Playgroud)

prject标签以<和>的形式显示.但是Location的内部标签显示为"<"和">"如何用<和>替换它们

更新:问题中出现了一个小错误.内部xml不适用于rtoid,它适用于位置

我将查询更新为

SELECT  ProjectId, 
       ProjectCode, 
       ProjectName, 
       TechId, 
      -- LocationId, 

      replace(replace( ( SELECT GeoId,PoliticalDivisionId ,GeographicLocationName,IsoCode,Longitude,Latitude,ParentLocationId,
       t2.CreatedBy,t2.CreatedOn,t2.LastUpdatedBy,t2.LastUpdatedOn
    FROM GeographicLocation t2
    WHERE GeoId = t1.LocationId
    FOR XML  PATH('Location') ), '&lt;', …
Run Code Online (Sandbox Code Playgroud)

sql-server for-xml for-xml-path

11
推荐指数
2
解决办法
7万
查看次数

调用FOR XML存储过程的实体框架截断为2033个字符

我有一个存储过程,在它的末尾使用FOR XML语句,并返回一些XML.

我正在使用.NET 4和实体框架,当我执行此存储过程的函数导入并尝试通过实体框架调用它时,它会截断2033个字符的返回值.

我将实体框架换成传统的ADO.NET方法来调用具有相同问题的存储过程 - 截断为2033个字符 - 这时我遇到了以下MSDN文章,解释这是设计并使用"ExecuteXMLReader" "克服它的方法:

http://support.microsoft.com/kb/310378

所以这现在作为临时修复工作,但我想使用Entity Framework函数导入,所以我没有将ADO.NET代码与EF代码混淆.

有没有什么方法可以在EF中使用函数导入,返回XML并克服2033字符限制?

关心
bgs264

stored-procedures entity-framework .net-4.0 for-xml

10
推荐指数
2
解决办法
3281
查看次数

查询在SQL Server中使用FOR XML PATH获取分层数据的XML输出

我有一个包含NodeId,NodeName,ParentNodeId列的表,我希望使用SQL查询以Xml的形式输出整个表数据.我认为在SQL Server中使用FOR XML PATH模式可以用来实现这个(我使用SQL Server 2008)使用递归,但不知道如何.提前致谢

<?xml version="1.0" encoding="utf-8" ?>
<Nodes>
  <Node Id="1" Name="node1">
    <Node Id="11" Name="node11">
      <Node Id="111" Name="node111" />
      <Node Id="112" Name="node112" />
    </Node>
  </Node>
  <Node Id="2" Name="node2">
    <Node Id="21" Name="node21">
      <Node Id="211" Name="node211" />
      <Node Id="212" Name="node212" />
    </Node>
  </Node>
</Nodes>
Run Code Online (Sandbox Code Playgroud)

xml sql t-sql sql-server for-xml

10
推荐指数
1
解决办法
7586
查看次数

无法将'WITH XMLNAMESPACES ... FOR XML PATH'的输出设置为变量?

我有如下查询:

;WITH XMLNAMESPACES ( DEFAULT 'http://www.somewhere.com')
SELECT ( 'SOMETHING' )
FOR XML PATH('RootNode'), TYPE
Run Code Online (Sandbox Code Playgroud)

运行此工作正常.但是,当我尝试将XML输出设置为如下变量时,我遇到了麻烦:

DECLARE @MYXML AS XML

SELECT @MYXML = (
;WITH XMLNAMESPACES ( DEFAULT 'http://www.somewhere.com')
SELECT ( 'SOMETHING' )
FOR XML PATH('RootNode'), TYPE
)
Run Code Online (Sandbox Code Playgroud)

这只是给我一个语法错误:-(任何关于如何实现这一点的想法将不胜感激.

xml sql sql-server namespaces for-xml

8
推荐指数
1
解决办法
4651
查看次数

特别适用于SqlServer中的Xml

我们有一个简单的表,需要转换为XML

 Declare @Person TABLE
(   [BusinessEntityID] [int] NOT NULL,
    [PersonType] [varchar](2) NULL,
    [Title] [varchar](30) NULL,
    [FirstName] [varchar](30) NULL,
    [MiddleName] [varchar](30) NULL,
    [LastName] [varchar](30) NULL)

Insert Into @Person Values(10001,'IN','Article','Carolyn','Jo','Alonso')
Run Code Online (Sandbox Code Playgroud)

我们需要这个xml用于在sql server中使用For XML输出

<?xml-stylesheet type='text/xsl' href='result.xsl'?>
<documents>
  <document>
    <field name="BusinessEntityID">10001</field>
    <field name="PersonType">IN</field>
    <field name="Title">Article</field>
    <field name="FirstName">Carolyn</field>
    <field name="MiddleName">Jo</field>
    <field name="LastName">Alonso</field>
  </document>
 </documents>
Run Code Online (Sandbox Code Playgroud)

sql for-xml sql-server-2008

8
推荐指数
1
解决办法
134
查看次数

在FOR XML SELECT中使用CHAR(13)

我正在尝试使用CHAR(13)强制换行,但问题是,我在FOR XML Select语句中这样做:

SELECT 
    STUFF((SELECT CHAR(13) + Comment 
FROM 
   myTable 
FOR XML PATH ('')) , 1, 1, '')
Run Code Online (Sandbox Code Playgroud)

这个问题是,我没有得到一个真正的新行.相反,我得到:

#x0D;
Run Code Online (Sandbox Code Playgroud)

所以数据字面上看起来像这样:

#x0D;First Line of Data#x0D;Second Line of Data#x0D;Etc
Run Code Online (Sandbox Code Playgroud)

所以我试着替换#x0D; 在FOR XML之外使用CHAR(13):

REPLACE(SELECT 
    STUFF((SELECT CHAR(13) + Comment 
FROM 
   myTable 
FOR XML PATH ('')) , 1, 1, '')), '#x0D;', CHAR(13))
Run Code Online (Sandbox Code Playgroud)

这让我很亲近.它会添加换行符,但它还包括每行末尾的&,以及第一行后的每行的开头:

First Line of Data&
&Second Line of Data&
&Etc
Run Code Online (Sandbox Code Playgroud)

sql t-sql for-xml sql-server-2008

6
推荐指数
2
解决办法
1万
查看次数