首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Server 2016中向XML添加编码XML声明prolog?

如何在Server 2016中向XML添加编码XML声明prolog?
EN

Stack Overflow用户
提问于 2020-03-08 07:43:08
回答 1查看 456关注 0票数 0

这是我的疑问:

代码语言:javascript
复制
SELECT *
FROM [dbo].[ENTETE]
FOR XML PATH('ENTETE'), TYPE

其结果是:

代码语言:javascript
复制
<ENTETE>
     <CIB_DECLARANT>10057</CIB_DECLARANT>
     <Type_Fichier>DECLARATION_TCN</Type_Fichier>
     <DATE_DECLARATION>03122019</DATE_DECLARATION> 
</ENTETE>

我想添加这样的XML编码:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<TCN xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ENTETE>
       <CIB_DECLARANT>10057</CIB_DECLARANT>
       <Type_Fichier>DECLARATION_TCN</Type_Fichier>
       <DATE_DECLARATION>03122019</DATE_DECLARATION> 
    </ENTETE>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-08 15:04:53

Server内部以UTF-16的形式保存XML数据类型。正因为如此,它删除了任何XML。

这就是为什么如果需要XML声明prolog,则需要使用NVARCHAR()数据类型。

请看下面的内容。

SQL

代码语言:javascript
复制
-- DDL and sample data population, start
DECLARE @ENTETE TABLE (CIB_DECLARANT INT, Type_Fischier VARCHAR(30), date_declaration DATE);
INSERT INTO @ENTETE (CIB_DECLARANT, Type_Fischier,  date_declaration) 
VALUES (10057, 'DECLARATION_TCN', '2019-12-03');
-- DDL and sample data population, end

-- just to see
SELECT
(
    SELECT *
    FROM @ENTETE
    FOR XML PATH('ENTETE'), TYPE
).query('<TCN  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
{
    for $x in /ENTETE
    return $x
}

</TCN>');

DECLARE @prolog NVARCHAR(100) = N'<?xml version="1.0" encoding="utf-8" standalone="no"?>'
   , @xml NVARCHAR(MAX);

-- real deal
SET @xml = @prolog + TRY_CAST((SELECT
(
    SELECT *
    FROM @ENTETE
    FOR XML PATH('ENTETE'), TYPE
).query('<TCN  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
{
    for $x in /ENTETE
    return $x
}

</TCN>')) AS NVARCHAR(MAX));

-- final XML with the prolog as NVARCHAR() data type
SELECT @xml;

输出(只为人眼缩进)

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<TCN xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <ENTETE>
      <CIB_DECLARANT>10057</CIB_DECLARANT>
      <Type_Fischier>DECLARATION_TCN</Type_Fischier>
      <date_declaration>2019-12-03</date_declaration>
   </ENTETE>
</TCN>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60585453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档