Как добавить пролог объявления XML с кодировкой в ​​XML в SQL Server 2016? - PullRequest
0 голосов
/ 08 марта 2020

Это мой запрос:

SELECT *
FROM [dbo].[ENTETE]
FOR XML PATH('ENTETE'), TYPE

Это результат:

<ENTETE>
     <CIB_DECLARANT>10057</CIB_DECLARANT>
     <Type_Fichier>DECLARATION_TCN</Type_Fichier>
     <DATE_DECLARATION>03122019</DATE_DECLARATION> 
</ENTETE>

Я хочу добавить кодировку XML, например:

<?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>

1 Ответ

0 голосов
/ 08 марта 2020

SQL Сервер содержит XML тип данных внутри как UTF-16. И из-за этого он удаляет любой пролог XML.

. Поэтому, если вам нужен пролог декларации XML, вам необходимо использовать NVARCHAR() тип данных.

Пожалуйста, см. Ниже .

SQL

-- 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;

Выход (с отступом только для человеческих глаз)

<?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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...