我正在寻找从SQL Server 2005表创建一个以逗号分隔的值列表,就像在JanetOhara的问题中一样.我正在使用类似于techdo对问题的回答中提出的查询.
一切正常,除了值列表正在进行XML编码.应该是什么:
Sports & Recreation,x >= y
Run Code Online (Sandbox Code Playgroud)
而是返回为:
Sports & Recreation,x <= y
Run Code Online (Sandbox Code Playgroud)
有没有办法在SQL Server中使用"FOR XML"时禁用XML字符编码?
我的数据看起来像:
OrderID CustomerID ItemID ItemName
10000 1234 111111 Product A
10000 1234 222222 Product B
10000 1234 333333 Product C
20000 5678 111111 Product A
20000 5678 222222 Product B
20000 5678 333333 Product C
Run Code Online (Sandbox Code Playgroud)
我想在SQL Server中编写一个T-SQL查询来返回如下数据:
<Root>
<Order>
<OrderID>10000</OrderID>
<CustomerID>1234</CustomerID>
<LineItem>
<ItemID>11111</ItemId>
<ItemName>Product A</ItemName>
</LineItem>
<LineItem>
<ItemID>22222</ItemId>
<ItemName>Product B</ItemName>
</LineItem>
<LineItem>
<ItemID>33333</ItemId>
<ItemName>Product B</ItemName>
</LineItem>
</Order>
<Order>
<OrderID>20000</OrderID>
<CustomerID>5678</CustomerID>
<LineItem>
<ItemID>11111</ItemId>
<ItemName>Product A</ItemName>
</LineItem>
<LineItem>
<ItemID>22222</ItemId>
<ItemName>Product B</ItemName>
</LineItem>
<LineItem>
<ItemID>33333</ItemId>
<ItemName>Product B</ItemName>
</LineItem>
</Order>
</Root>
Run Code Online (Sandbox Code Playgroud)
我尝试使用以下方法返回XML中的查询:
FOR XML …Run Code Online (Sandbox Code Playgroud) 此代码基本上将基于一个字符串中的位置的字符转换为另一个字符串中相同位置的字符,并且它针对表中的所有行运行.
当我运行它(简化版)时:
DECLARE @R char(40)
DECLARE @U char(40)
SET @R=' abcdefghijklmnopqrstuvwxyz!@#$%^&*()_+'+char(181)
SET @U=REVERSE(@R)
DECLARE @TestTable TABLE (RowID int identity(1,1) primary key, Unreadable varchar(500))
INSERT INTO @TestTable VALUES ('+µt$zw!*µsu+yt!+s$xy')
INSERT INTO @TestTable VALUES ('%*!!xµpxu!(')
INSERT INTO @TestTable VALUES ('pxpµnxrµu+yµs%$t')
;WITH CodeValues AS
(
SELECT
Number,SUBSTRING(@R,Number,1) AS R,ASCII(SUBSTRING(@U,Number,1)) AS UA
FROM Numbers
WHERE Number<=LEN(@R)
)
SELECT
t.RowID
,(SELECT
''+c.R
FROM Numbers n
INNER JOIN CodeValues c ON ASCII(SUBSTRING(t.Unreadable,n.Number,1))=c.UA
WHERE n.Number<=LEN(t.Unreadable)
FOR XML PATH('')
) AS readable
FROM @TestTable t
Run Code Online (Sandbox Code Playgroud)
我得到以下内容:
RowID readable …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 PATH('')TSQL 按特定列对列值进行分组.这是两种情况下的结果(请注意,没有XML代码 - 即:SELECT * FROM @xml- 与XML代码相同):
Class | Animals
=================================
Asteroidea | Starfish
Mammalia | Dog
Mammalia | Cat
Mammalia | Coyote
Reptilia | Crocodile
Reptilia | Lizard
Run Code Online (Sandbox Code Playgroud)
根据这篇文章和这篇文章(请注意,第二篇文章遗漏了GROUP BY,我不确定作者如何设法在没有它的情况下解决这个问题 - 我已经尝试过它只生成所有值),语法应该是如下图所示:
DECLARE @xml TABLE(
Animal VARCHAR(50),
Class VARCHAR(50)
)
INSERT INTO @xml
VALUES ('Dog','Mammalia')
, ('Cat','Mammalia')
, ('Coyote','Mammalia')
, ('Starfish','Asteroidea')
, ('Crocodile','Reptilia')
, ('Lizard','Reptilia')
SELECT x1.Class
, STUFF((SELECT ',' + x2.Animal AS [text()]
FROM @xml …Run Code Online (Sandbox Code Playgroud) 我想直接从数据库创建一个站点地图xml文件(包括图像),而不需要其他进程(如转换或其他技巧).
我的查询是:
;WITH XMLNAMESPACES(
DEFAULT 'http://www.sitemaps.org/schemas/sitemap/0.9',
'http://www.google.com/schemas/sitemap-image/1.1' as [image] )
SELECT
(SELECT
'mysite' as [loc],
(select
'anotherloc'
as [image:loc]
for XML path('image:image'), type
)
for xml path('url'), type
)
for xml path('urlset'), type
Run Code Online (Sandbox Code Playgroud)
返回:
<urlset xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<loc>mysite</loc>
<image:image xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<image:loc>anotherloc</image:loc>
</image:image>
</url>
</urlset>
Run Code Online (Sandbox Code Playgroud)
但我需要这个输出,没有重复的名称空间声明:
<urlset xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>mysite</loc>
<image:image>
<image:loc>anotherloc</image:loc>
</image:image>
</url>
</urlset>
Run Code Online (Sandbox Code Playgroud) 我有这个问题:
SELECT DISTINCT
f.CourseEventKey,
(
SELECT f.Title + '; ' AS [text()]
FROM @Facilities
WHERE CourseEventKey = f.CourseEventKey
ORDER BY f.Title
FOR XML PATH('')
) Facilities
FROM @Facilities f
Run Code Online (Sandbox Code Playgroud)
它产生这个结果集:
CourseEventKey Facilities
-------------- -----------------------------------
29 Test Facility 1;
30 Memphis Training Room;
32 Drury Inn & Suites Creve Coeur;
Run Code Online (Sandbox Code Playgroud)
数据很好,但&实际上是编码的&,不适合我的目的.
如何修改此查询以返回数据中特殊字符的原始值?
在读完一个答案和第二个答案以及sqlcmd上的infopage之后,我仍然无法让以下工作.
我试图使用批处理文件中的sqlcmd将结果查询到xml文件中.
批处理文件如下所示:
sqlcmd -R -d DBName -i "c:\inputquery.sql" -h-1 -y 0 -o "c:\outputfile.xml"
Run Code Online (Sandbox Code Playgroud)
简化的SQL查询是:
:XML ON
SELECT '<?xml version="1.0" encoding="UTF-8"?>' +
CAST((
SELECT Columns FROM Table
FOR XML PATH ('Product'), ROOT('Products')
)
AS NVARCHAR(MAX))
Run Code Online (Sandbox Code Playgroud)
输出是一个大约1025Kb的xml文件,一个截断的字符串.我认为它截断到1mb,但你怎么能阻止这个呢?目标是将完整的查询结果放入xml文件中.据我所知,所有选项都已使用.顺便使用TSQL SSMS2008.
我想嵌套我的每个XML元素.
请看以下示例:
DECLARE @TempTable TABLE
(
[Column1] char(10),
[Column2] char(10)
);
INSERT INTO @TempTable([Column1], [Column2]) VALUES
('some value', 'some value'),
('some value', 'some value'),
('some value', 'some value'),
('some value', 'some value')
SELECT (
SELECT * FROM @TempTable
FOR XML PATH('Row'), TYPE)
FOR XML PATH('ParentRow'), ROOT('Root')
Run Code Online (Sandbox Code Playgroud)
这将返回以下XML:
<Root>
<ParentRow>
<Row>
<Column1>some value</Column1>
<Column2>some value</Column2>
</Row>
<Row>
<Column1>some value</Column1>
<Column2>some value</Column2>
</Row>
<Row>
<Column1>some value</Column1>
<Column2>some value</Column2>
</Row>
<Row>
<Column1>some value</Column1>
<Column2>some value</Column2>
</Row>
</ParentRow>
</Root>
Run Code Online (Sandbox Code Playgroud)
这不是我想要格式化XML的方式.相反,我希望每个<Row>元素都<ParentRow>包含如下元素: …
我有这样一张桌子:
EmployeeId EmployeeName ItemName
4 Ganesh Key Board
4 Ganesh Processor
1 Jignesh Key Board
1 Jignesh Mouse
1 Jignesh Processor
3 Rakesh Key Board
2 Tejas Key Board
2 Tejas Mouse
2 Tejas Processor
Run Code Online (Sandbox Code Playgroud)
我需要查询这个,就好像itemname不同employeeid,employeename我们应该将项目分为','.
就像下面给出的那个:
EmployeeId EmployeeName ItemName
1 Jignesh Key Board, Mouse, Processor
2 Tejas Key Board, Mouse, Processor
3 Rakesh Key Board
4 Ganesh Key Board, Processor
Run Code Online (Sandbox Code Playgroud)
这是SQL查询:

任何人都可以帮助我将上述SQL查询转换为Lambda表达式吗?
for-xml-path ×10
sql-server ×5
t-sql ×5
sql ×3
xml ×3
batch-file ×1
encoding ×1
escaping ×1
for-xml ×1
lambda ×1
linq ×1
namespaces ×1
nested ×1
substring ×1