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>