SQL生成的XML上的无效字符

时间:2019-01-22 12:17:34

标签: sql-server xml utf-8 sql-server-2005 bcp

我需要生成一个XML,以便从我的SQL2005数据库加载到Internet站点上。一切正常,但是将文件加载到需要它的Web服务上时,出现此错误:

  

'。',十六进制值0x00,是无效字符。第1行,位置   41。

xml代码可以正常工作,但是我认为问题出在文件中。 Xml是通过该查询生成的

set @cmd = 'bcp "SELECT XML FROM ' + @DBNAME + '.dbo.FATTELETTR WHERE PROGRESSIVO LIKE ' +  @PROGRESSIVO + ' " queryout ' + @Filename + ' -U user -P pass -w -r -t -x';
--print @cmd

EXEC XP_CMDSHELL @cmd, no_output;

这是一个文件示例:

    <?xml version="1.0" encoding="UTF-8" ?> <p:FatturaElettronica versione="FPR12" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.2/Schema_del_file_xml_FatturaPA_versione_1.2.xsd">
<FatturaElettronicaHeader>
    ................ content............
    </FatturaElettronicaHeader>
    <FatturaElettronicaBody>
    ................ content............
    </FatturaElettronicaBody></p:FatturaElettronica>

如果我直接获取生成的文件,则报错,如果获取xml内容,则显示INSTEAD,创建一个新的xml文件,然后将复制的内容粘贴到手动创建的文件中,一切正常,我没有错误。

另外,如果我尝试在Internet Explorer上打开xml文件,则生成的sql为空,我看到一个空白页,而是加载了手动创建的sql。

因此文件有问题。但是哪个呢?

1 个答案:

答案 0 :(得分:0)

您的XML文件的编码被声明为UTF-8 <?xml version="1.0" encoding="UTF-8" ?>,但是SQL Server不支持UTF-8。它对Unicode数据使用UTF-16。因此,磁盘上的文件存储为UTF-16(每个符号2个字节),同时您指示XML解析器将其读取为UTF-8(可变符号长度),其中1个字节用于基本拉丁字符和数字。例如,在UTF-8中,字母A被编码为一个字节41,在UTF-16中则被编码为2个字节0041。前导00最有可能是引起错误的那个。

您必须将XML文件的声明编码更改为UTF-16,或者更改保存XML数据的方式以匹配声明的编码。