标签: for-xml-path

如何将属性添加到以元素为中心的FOR XML PATH查询中

我正在构建一些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)

t-sql sql-server for-xml-path

5
推荐指数
1
解决办法
9576
查看次数

FOR XML PATH 和 xsi:nil 属性

大家早上好,

我有一个使用 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)

xml t-sql sql-server-2005 for-xml for-xml-path

5
推荐指数
1
解决办法
5393
查看次数

SQL Server:如何在使用XML Path组合行后删除最后一个逗号

我找到了一种方法将多行合并为一行,以逗号分隔,但现在我想删除最后一个逗号.

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)

sql sql-server for-xml-path

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

FOR XML PATH('')在连接行时的工作原理

FOR XML PATH ('')在SQL Server中连接行时,该子句如何工作?

我只想解释该FOR XML PATH ('')条款的工作原理......

t-sql sql-server for-xml-path

5
推荐指数
1
解决办法
8685
查看次数

将 MSSQL 'FOR XML PATH' 转换为 Oracle

我有一个语句来填充我的 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 相同的输出。有人能帮我吗?

编辑:

以下是一些示例数据: …

sql sql-server oracle code-conversion for-xml-path

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

超过 130 的字符长度不显示在列中

我在使用数据透视表进行的一项调查中提出了很多问题。要动态收集我的数据透视表的所有问题,我使用stufffor 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)

t-sql sql-server for-xml-path azure-synapse

5
推荐指数
1
解决办法
2151
查看次数

使用 T-SQL FOR XML PATH 删除空的 XML 节点

我正在使用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 t-sql sql-server for-xml-path

4
推荐指数
1
解决办法
4180
查看次数

TSQL FOR XML格式

我有一个表,我想转换成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)

有谁知道我怎么做:

  • A)根据该订单的记录数,将"LIN"'NUM'属性更改为增量?
  • B)将'Name'属性添加到'LIN'细节并将字段名称更改为'FLD'.当我尝试将名称更改为"FLD"时,它将值汇总到一个节点上,如下所示:

    <row> …
    Run Code Online (Sandbox Code Playgroud)

xml t-sql sql-server for-xml-path

4
推荐指数
1
解决办法
331
查看次数

如何在SQL Server 2008+中使用ORDER BY和FOR XML选择DISTINCT

所以我现在已经和它斗争了一段时间,我认为这必须是一项简单的任务.我的目标是返回一个字符串,其中返回的所有唯一行都以正斜杠分隔,并按输入时间排序.这是示例数据

表:地点

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,它就会因错误而崩溃.

想法?

sql distinct for-xml-path

3
推荐指数
1
解决办法
6714
查看次数

TD HTML 标签的右对齐

出于某些原因,我正在为特定时间段的客户生成 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)

html sql-server for-xml-path

3
推荐指数
1
解决办法
6456
查看次数