我正在构建一些HTML以包含在电子邮件正文中并使用sp_send_dbmail发送.我想对齐一些列.有没有一种简单的方法可以做到这一点(没有使用FOR XML EXPLICIT重写它)?
declare @html varchar(max)
set @html = '<table cellpadding=0 cellspacing=0 border=0>'
set @html +=
cast(
(select
'Column1' as td, '',
'Column2' as td, '',
'Column3' as [td align=right] /* Would like to do something like this */
for xml path('tr')) as varchar(max)
)
set @html += '</table>'
Run Code Online (Sandbox Code Playgroud) 大家早上好,
我有一个使用 FOR XML PATH 输出 .xml 文件的大查询。我有主要的选择,它基本上只代表根,即
select *
from tbl
for xml path ('root'),elements xsinil
Run Code Online (Sandbox Code Playgroud)
然后我在这个主选择中进行了后续的嵌套选择,即
select
(
select null [level1],
'2' [level2]
from tbl
for xml path('nested1'),type
),
(
select null [level1],
'2' [level2]
from tbl
for xml path('nested2'),type
)
for xml path('root'),elements xsinil
Run Code Online (Sandbox Code Playgroud)
然而,放在 for xml 路径上的元素 xsinil 参数对包含的子查询没有任何影响,即 Level1 元素只是一个封闭的标签。我需要将其显示为 xsi:nil="true"。
我可以通过向 for xml 路径语句添加元素 xsinil 参数来实现这一点,例如
for xml path('nested1'),type,elements xsinil
Run Code Online (Sandbox Code Playgroud)
这样做的问题是命名空间声明在子查询级别重复。
我可以找到很多使用元素 xsinil 的例子,但没有一个例子可以应用于没有重复命名空间声明的子查询。
为了确认,我正在寻找以下输出:
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<nested1>
<level1 xsi:nil="true">
<level2>2</level2>
</nested1>
<nested2>
<level1 …Run Code Online (Sandbox Code Playgroud) 我找到了一种方法将多行合并为一行,以逗号分隔,但现在我想删除最后一个逗号.
CREATE TABLE supportContacts
(
id int identity primary key,
type varchar(20),
details varchar(30)
);
INSERT INTO supportContacts (type, details)
VALUES ('Email', 'admin@sqlfiddle.com'),
('Twitter', '@sqlfiddle');
Run Code Online (Sandbox Code Playgroud)
此查询组合了类型,但我现在要删除最后一个逗号:
SELECT top (2)
type + ', ' AS 'data()'
FROM
supportContacts
ORDER BY
type DESC
FOR XML PATH('')
Run Code Online (Sandbox Code Playgroud)
这是目前的结果:
Twitter, Email,
Run Code Online (Sandbox Code Playgroud) FOR XML PATH ('')在SQL Server中连接行时,该子句如何工作?
我只想解释该FOR XML PATH ('')条款的工作原理......
我有一个语句来填充我的 MSSQL 数据库上的一个表。它将一些值连接在一起,用分号分隔。
INSERT INTO XXAArcDocSWSB (ArcDocINr, SWorte)
SELECT A.ArcDocINr, B.SWorte FROM XXAArcDoc A
LEFT JOIN (
SELECT DISTINCT T2.ArcDocINr,
SUBSTRING(
(
SELECT ';' + T1.SWort AS [text()]
FROM (SELECT D.ArcDocINr, SW.SWort FROM XXAArcDoc D, XXAArcSW SW WHERE D.ArcDocINr = SW.ArcDocINr) T1
WHERE T1.ArcDocINr = T2.ArcDocINr
For XML PATH ('')
), 2, 255) [SWorte]
FROM (SELECT D.ArcDocINr, SW.SWort FROM XXAArcDoc D, XXAArcSW SW WHERE D.ArcDocINr = SW.ArcDocINr) T2
) B ON A.ArcDocINr = B.ArcDocINr
Run Code Online (Sandbox Code Playgroud)
我没有足够的知识将其转换为 Oracle。它应该给我与 MSSQL 相同的输出。有人能帮我吗?
编辑:
以下是一些示例数据: …
我在使用数据透视表进行的一项调查中提出了很多问题。要动态收集我的数据透视表的所有问题,我使用stuff和for xml path。然而,长度> 130 的问题文本似乎没有显示。
我可以从我的中选择所有列cte Questions,所以我知道数据在那里。
更新:如果我选择输出,我的总长度约为 8.000,这是否是因为 nvarchar(max) 不存储超过 8.000,即使它应该能够存储大约 2GB?
我究竟做错了什么?
SELECT QuestionList = cast(STUFF((
SELECT ',' + QUOTENAME(cast(question AS NVARCHAR(max)))
FROM questions
ORDER BY [AgpdbQuestionID]
FOR XML PATH('')
), 1, 1, '') AS NVARCHAR(max))
Run Code Online (Sandbox Code Playgroud) 我正在使用FOR XML PATHSQL Server 2008R2 中的表构造 XML。XML 必须构造如下:
<Root>
<OuterElement>
<NumberNode>1</NumberNode>
<FormattedNumberNode>0001</KFormattedNumberNode>
<InnerContainerElement>
<InnerNodeOne>0240</InnerNodeOne>
<InnerNodeStartDate>201201</InnerNodeStartDate>
</InnerContainerElement>
</OuterElement>
</Root>
Run Code Online (Sandbox Code Playgroud)
根据模式文件,InnerContainerElement是可选的,而InnerNodeOne是必需的。架构文件不是由我设置的,非常复杂,相互引用并且没有明确的 XSD 命名空间,因此我无法轻松将它们加载到数据库中。
XML 必须从一个表中创建,该表使用以下查询填充:
SELECT
1 AS NumberNode
, '0001' AS [FormattedNumberNode]
, '0240' AS [InnerNodeOne]
, '201201' AS [InnerNodeStartDate]
INTO #temporaryXMLStore
UNION
SELECT
2 AS NumberNode
, '0001' AS [FormattedNumberNode]
, NULL AS [InnerNodeOne]
, NULL AS [InnerNodeStartDate]
Run Code Online (Sandbox Code Playgroud)
我可以想到两种使用FOR XML PATH.
1) 使用 'InnerContainerElement' 作为来自 XML 子查询的命名结果:
SELECT
NumberNode
, [FormattedNumberNode]
, …Run Code Online (Sandbox Code Playgroud) 我有一个表,我想转换成XML格式.该表称为tempTable,并保存数据:
REF DESC QTY
100001 Normal 1
100002 OOH 1
Run Code Online (Sandbox Code Playgroud)
我需要以这种给定的格式创建XML:
<row>
<LIN NUM="1">
<FLD NAME="REF">100001</FLD>
<FLD NAME="DES">Normal</FLD>
<FLD NAME="QTY">1</FLD>
</LIN>
<LIN NUM="2">
<FLD NAME="REF">100002</FLD>
<FLD NAME="DES">OOH</FLD>
<FLD NAME="QTY">1</FLD>
</LIN>
</row>
Run Code Online (Sandbox Code Playgroud)
我试过以下代码:
SET @line = (SELECT '1' AS '@NUM', REF AS 'REF', DES AS 'DES', QTY AS 'QTY' FROM tempTable WHERE ORDER= @ORDER
FOR XML PATH('LIN'))
SELECT @line
FOR XML PATH
Run Code Online (Sandbox Code Playgroud)
然而,这会产生:
<row>
<LIN NUM="1">
<REF>100001</REF>
<DES>Normal</DES>
<QTY>1</QTY>
</LIN>
<LIN NUM="1">
<REF>100002</REF>
<DES>OOH</DES>
<QTY>1</QTY>
</LIN>
</row>
Run Code Online (Sandbox Code Playgroud)
有谁知道我怎么做:
B)将'Name'属性添加到'LIN'细节并将字段名称更改为'FLD'.当我尝试将名称更改为"FLD"时,它将值汇总到一个节点上,如下所示:
<row> …Run Code Online (Sandbox Code Playgroud)所以我现在已经和它斗争了一段时间,我认为这必须是一项简单的任务.我的目标是返回一个字符串,其中返回的所有唯一行都以正斜杠分隔,并按输入时间排序.这是示例数据
表:地点
Location Time
======== =======
OR1 2013-02-06 16:55:47.000
OR1 2013-02-06 16:56:34.000
ICU1 2013-02-06 16:59:50.000
OR1 2013-02-06 17:02:50.000
ICU1 2013-02-06 17:09:50.000
Run Code Online (Sandbox Code Playgroud)
因此,鉴于上面的数据表,我想返回一个表示"OR1/ICU1"的字符串.我可以使用FOR XML PATH将不同的值作为字符串返回,但是一旦我抛出ORDER BY,它就会因错误而崩溃.
想法?
出于某些原因,我正在为特定时间段的客户生成 HTML 代码,在该代码中,我需要美元字段(“已支付”和“费用”列)文本右对齐,这怎么可能使用 XML raw('tr')。
create table #Customer
(
id varchar(500),
CustomerName varchar(500),
customertype varchar(500),
LastOrderNo varchar(500),
charges varchar(500),
Payed varchar(500)
)
insert into #Customer
select '201','Cus1','XX','on-09799','60.09$','30.00$'
union all
select '202','Cus2','XX','on-09777','90.09$','50.00$'
union all
select '203','Cus3','YY','on-09766','100.09$','100.00$'
union all
select '204','Cus4','ZZ','on-09788','2000.09$','2000.00$'
Declare @Body varchar(max)
set @Body=''
select @Body =@Body+'<table cellpadding=0 cellspacing=0 border=0 >' +
'<tr><td width="100px" > ID</td>' +
'<td width="140px" >CustomerName</td>' +
'<td width="100px" >Customertype</td>' +
'<td width="100px" > LastOrderNo</td>' +
'<td width="100px" align="right" bgcolor=#E6E6FA><b> charges</b></td>' +
'<td width="110px" align="right" bgcolor=#E6E6FA><b> …Run Code Online (Sandbox Code Playgroud) for-xml-path ×10
sql-server ×8
t-sql ×6
sql ×3
xml ×3
distinct ×1
for-xml ×1
html ×1
oracle ×1