【问题标题】:XML Cdata format and variable input TSQLXML Cdata 格式和变量输入 TSQL
【发布时间】:2020-01-30 20:06:35
【问题描述】:
DECLARE @TransactionId NVARCHAR(100)
DECLARE @TransactionDateTime DATETIME
--Setting Variable
SET @TransactionId= (SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID()))
SET @TransactionDateTime= GETDATE()
--Start the XML Selction
SELECT
1 AS Tag,
NULL AS Parent,
NULL AS 'Tag!1!',
NULL AS 'TransactionType!2!CollectSampling!cdata',
NULL AS 'TransactionID!2!TransactionId!cdata',
NULL AS 'TransactionDateTime!2!TransactionDateTime!cdata',
NULL AS 'ContainerName!2!Name!cdata',
NULL AS 'Make!2!Make!cdata',
NULL AS 'Model!2!Model!cdata',
NULL AS 'Price!2!Price!cdata',
NULL AS  'Type!2!Type!cdata'
Union  ALL
SELECT
2 AS Tag,
1 AS Parent,
NULL,
'CollectSample',
@TransactionId,
@TransactionDateTime,
[Name] ,
[Make] ,
[Model] ,
[Price]  ,
[Type]
from dbo.RepCar
FOR XML EXPLICIT,  ROOT('Message')

以下是我想要的输出,但不断收到 XML 格式错误。也只是消息是父母 想要输出如下。我正在使用变量来填充几个标签,而 CollectSample 是静态字段。

 <Message>
    <TransactionType><![CDATA[CollectSamplingData]]></TransactionType>
    <TransactionID><![CDATA[0CA4E46F-5143-498C-B1AC-F990FF70462E]]></TransactionID>
    <TransactionDate><![CDATA[2020-01-10T14:20:30-05:00]]></TransactionDate>
    <CName><![CDATA[Name]]></CName>
    <MakeCar><![CDATA[Make]]></MakeCar>
    <MakeModel><![CDATA[Model]]></MakeModel>
    <DataValue><![CDATA[Price]]></DataValue>
    <MakeType><![CDATA[Type]]></MakeType>
  </Message>

【问题讨论】:

  • Gatorsdog,您使用的是有点过时的 FOR XML EXPLICIT 方法。请修改您的原始帖子并为 dbo.repcar 数据库表添加缺失的 DDL 和数据样本群。
  • Gatorsdog,SQL-Server 的开发人员决定不支持CDATA 部分是有充分理由的。更重要的是,如果您将上面的 XML 存储为原生 XML 数据类型,任何CDATA 部分都将消失。引入这种格式是为了嵌入未转义的内容,因此引擎应该可以读取它,但是 - 一般来说 - 没有理由 write XML 与 CDATA 部分。你真的,真的需要这种老式的方法吗? EXPLICIT 模式真是让人头疼……
  • 不幸的是,是的。我正在与供应商合作,他们要求格式。相信我,我发送了 XML,他们发回了对 CDATA 的需求。
  • @Gatorsdog 您可以使用简单的concat() 在字符串级别创建它。但永远不要尝试以原生 xml 类型存储这个 xml...
  • USE tempdb CREATE TABLE RepCar (ContainerName VARCHAR(10), Make VARCHAR(10), Model VARCHAR(10), Price INT, Type VARCHAR(10)) 插入RepCar 选择'M1', ' BMW', '750' , 75000, 'Sedan' union all select 'M2', 'Lexus', 'GSF' , 85000, 'Sedan'union all select 'M3', 'Lexus', 'IS', 35000, ' Sport'union all select 'M4', 'BMW', 'M4', 105000, 'Sport'

标签: sql-server xml tsql cdata


【解决方案1】:
declare @RepCar table
(
[Name] varchar(10),
[Make] varchar(10),
[Model] varchar(10),
[Price]  money,
[Type] varchar(10)
);

insert into @RepCar
(
Name, Make, Model, Price, Type
)
values
('Car1', 'Make1', 'Model1', 100, 'Type1'),
('Car2', 'Make2', 'Model2', 200, 'Type2'),
('Car3', 'Make3', 'Model3', 300, 'Type3');



DECLARE @TransactionId NVARCHAR(100)
DECLARE @TransactionDateTime DATETIME
--Setting Variable
SET @TransactionId= (SELECT CONVERT(VARCHAR, CURRENT_TRANSACTION_ID()))
SET @TransactionDateTime= GETDATE()
--Start the XML Selction


/*
ElementName!TagNumber!AttributeName!Directive 

AttributeName
Provides the name of the attribute to construct in the specified ElementName. This is the behavior if Directive is not specified.

!!!! If Directive is specified and it is xml, cdata, or element, this value is used to construct an element child of ElementName, and the column value is added to it.!!!!

*/


select 1 AS Tag,
0 AS Parent,
'CollectSamplingData' as 'Message!1!TransactionType!cdata',
@TransactionId as 'Message!1!TransactionID!cdata',
@TransactionDateTime  as 'Message!1!TransactionDate!cdata',
[Name]  as 'Message!1!CName!cdata',
[Make]  as 'Message!1!MakeCar!cdata',
[Model]  as 'Message!1!MakeModel!cdata',
[Price]   as 'Message!1!DataValue!cdata',
[Type]  as 'Message!1!MakeType!cdata'
from @RepCar --dbo.RepCar
FOR XML EXPLICIT, ROOT('Messages');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    相关资源
    最近更新 更多