我正在尝试以客户指定的特定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,但显然,如果我可以帮助他们的话,为什么不这样做呢......
有什么建议?
我有一个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进行任何更改以启用此方案吗?
我有一个表格,结构如下:
------------------------------
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克里斯莱昂.
我在数据库中有一个邻接列表,希望通过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的新手
我有这样的查询
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>
<Location><GeoId>235</GeoId><PoliticalDivisionId>2</PoliticalDivisionId><GeographicLocationName>UNITED STATES</GeographicLocationName><IsoCode>US</IsoCode></Location>
<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') ), '<', …Run Code Online (Sandbox Code Playgroud) 我有一个存储过程,在它的末尾使用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
我有一个包含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) 我有如下查询:
;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
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) 我正在尝试使用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) for-xml ×10
sql ×6
t-sql ×5
xml ×5
sql-server ×4
.net-4.0 ×1
for-xml-path ×1
formatting ×1
namespaces ×1
xslt ×1