【问题标题】:SQL FOR XML Repeating Root NodeSQL FOR XML 重复根节点
【发布时间】:2020-04-28 16:04:45
【问题描述】:

我正在尝试使用 SQL FOR XML 子句生成自定义 XML 作为在 SSIS 中使用的输出。我非常接近。我在“类型”选项中找不到任何内容。出于某种原因,“类型”让我接近。非常感谢您的帮助。 想要的输出是这样的。

<NLS CommitBlock="1" EnforceTagExistence="1">
  <LOAN loannumber="892127" acctrefno="145415" />
  <LOAN loannumber="892130" acctrefno="145418" />
  <LOAN loannumber="892131" acctrefno="145419" />
</NLS>

我得到的输出是这样的。

<NLS CommitBlock="1" EnforceTagExistence="1">
  <LOAN loannumber="892127" acctrefno="145415" />
</NLS>
<NLS CommitBlock="1" EnforceTagExistence="1">
  <LOAN loannumber="892130" acctrefno="145418" />
</NLS>
<NLS CommitBlock="1" EnforceTagExistence="1">
  <LOAN loannumber="892131" acctrefno="145419" />
</NLS>

我的 SQL 是这样的。

SELECT  TOP (3) 
'1' AS 'CommitBlock',
'1' AS 'EnforceTagExistence',
(SELECT
vw_deferments.loan_number AS '@loannumber',
vw_deferments.acctrefno AS '@acctrefno'
FOR XML Path('LOAN'), type)
FROM            vw_deferments INNER JOIN
                loanacct ON vw_deferments.acctrefno = Iloanacct.acctrefno
WHERE (vw_deferments.Loan_Status IN ('PAYING', 'REPO REVIEW', 'REPO ASSIGN')) 
-- tons of irrelevant AND clauses are here
FOR XML RAW('NLS')

【问题讨论】:

  • 在提出问题时,您需要提供一个可重现的最小示例。请参考以下链接:stackoverflow.com/help/minimal-reproducible-example 请提供以下内容: (1) DDL 和样本数据填充,即 CREATE table(s) 加上 INSERT 语句。 (2) 你需要做什么,即逻辑,以及你的代码实现。 (3) 基于样本数据的期望输出。 (4) 你的 SQL Server 版本 (SELECT @@version;)

标签: sql-server xml tsql


【解决方案1】:

在没有提供 DDL 和样本数据群的情况下,我提出了以下概念示例。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, loannumber VARCHAR(10), acctrefno VARCHAR(10));
INSERT INTO @tbl (loannumber, acctrefno)
VALUES
('892127','145415')
,('892130','145418')
,('892131','145419');
-- DDL and sample data population, end

SELECT TOP(1) '1' AS [@CommitBlock], '1' AS [@EnforceTagExistence]
, (
    SELECT loannumber AS [@loannumber]
        , acctrefno AS [@xacctrefno]
    FROM @tbl
    FOR XML PATH('LOAN'), TYPE
)
FROM @tbl
FOR XML PATH('NLS'), TYPE;

输出

<NLS CommitBlock="1" EnforceTagExistence="1">
  <LOAN loannumber="892127" xacctrefno="145415" />
  <LOAN loannumber="892130" xacctrefno="145418" />
  <LOAN loannumber="892131" xacctrefno="145419" />
</NLS>

【讨论】:

    【解决方案2】:

    你可以用更好的缩进来清楚地看到它会产生什么:

    SELECT 
        [NLS/@CommitBlock]          = 1,
        [NLS/@EnforceTagExistence]  = 1,
        [NLS] = (
                 SELECT
                        [@loannumber] = vw_deferments.loan_number,
                        [@acctrefno]  = vw_deferments.acctrefno
                 FROM vw_deferments
                 JOIN loanacct ON vw_deferments.acctrefno = Iloanacct.acctrefno
                 WHERE 
                      (vw_deferments.Loan_Status IN ('PAYING', 'REPO REVIEW', 'REPO ASSIGN')) 
                      -- -- tons of irrelevant AND clauses are here
                 FOR XML PATH('LOAN'), type
                )
    FOR XML PATH('')
    

    【讨论】:

    • 方法也不错。请在 LinkedIn 上与我联系。
    猜你喜欢
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多