【问题标题】:XML parsing Error Illegal qualified name characterXML解析错误非法限定名字符
【发布时间】:2016-08-19 20:36:09
【问题描述】:

我正在使用 SQL Server 2008 Management Studio,并尝试将一些 XML 数据插入我的表中。我以前从来没有这样做过,你能解释一下为什么 SQL 会抛出错误吗?

这是我的数据:

select 
    IDPatient, IDObjet, Nplan, dateCreation, dateModification, actif,
    case 
       when ISNULL(unite_20,'') + ISNULL(date_20,'') <> '' 
          then 20
       when ISNULL(unite_19,'') + ISNULL(date_19,'') <> '' 
          then 19 
       when ISNULL(unite_18,'') + ISNULL(date_18,'') <> '' 
          then 18 
       when ISNULL(unite_17,'') + ISNULL(date_17,'') <> '' 
          then 17 
       when ISNULL(unite_16,'') + ISNULL(date_16,'') <> '' 
          then 16 
       when ISNULL(unite_15,'') + ISNULL(date_15,'') <> '' 
          then 15
       ... and so forth .....
       when ISNULL(unite_1,'') + ISNULL(date_1,'') <> '' 
          then 1 
    End As NbrAdministration,
    0,      
    '<IDObjet>'+ 
 case when ISNULL(unite_1,'') + ISNULL(date_1,'') <> '' then
 '<Administration1>'+
 '<Unite>'+isnull(convert(varchar,Unite_1),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_1,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_1,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_1,'')+'</Initiale>'+
 '<Site>'+isnull(Site_1,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_1),'')+'</IDRV>'+
 '</Administration1>'
 else ''
 end + 
  case when ISNULL(unite_2,'') + ISNULL(date_2,'') <> '' then
 '<Administration2>'+
 '<Unite>'+isnull(convert(varchar,Unite_2),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_2,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_2,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_2,'')+'</Initiale>'+
 '<Site>'+isnull(Site_2,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_2),'')+'</IDRV>'+
 '</Administration2>'   
 else ''
 end +
  case when ISNULL(unite_3,'') + ISNULL(date_3,'') <> '' then
 '<Administration3>'+
 '<Unite>'+isnull(convert(varchar,Unite_3),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_3,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_3,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_3,'')+'</Initiale>'+
 '<Site>'+isnull(Site_3,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_3),'')+'</IDRV>'+
 '</Administration3>'
 else ''
 end +
 case when ISNULL(unite_4,'') + ISNULL(date_4,'') <> '' then
 '<Administration4>'+
 '<Unite>'+isnull(convert(varchar,Unite_4),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_4,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_4,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_4,'')+'</Initiale>'+
 '<Site>'+isnull(Site_4,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_4),'')+'</IDRV>'+
 '</Administration4>'
 else ''
 end +
 case when ISNULL(unite_5,'') + ISNULL(date_5,'') <> '' then
 '<Administration5>'+
 '<Unite>'+isnull(convert(varchar,Unite_5),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_5,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_5,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_5,'')+'</Initiale>'+
 '<Site>'+isnull(Site_5,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_5),'')+'</IDRV>'+
 '</Administration5>'
 else ''    
 end +
 case when ISNULL(unite_6,'') + ISNULL(date_6,'') <> '' then
 '<Administration6>'+
 '<Unite>'+isnull(convert(varchar,Unite_6),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_6,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_6,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_6,'')+'</Initiale>'+
 '<Site>'+isnull(Site_6,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_6),'')+'</IDRV>'+
 '</Administration6>'
 else ''    
 end +
 case when ISNULL(unite_7,'') + ISNULL(date_7,'') <> '' then
 '<Administration7>'+
 '<Unite>'+isnull(convert(varchar,Unite_7),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_7,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_7,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_7,'')+'</Initiale>'+
 '<Site>'+isnull(Site_7,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_7),'')+'</IDRV>'+
 '</Administration7>'
 else ''    
 end +
 case when ISNULL(unite_8,'') + ISNULL(date_8,'') <> '' then
 '<Administration8>'+
 '<Unite>'+isnull(convert(varchar,Unite_8),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_8,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_8,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_8,'')+'</Initiale>'+
 '<Site>'+isnull(Site_8,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_8),'')+'</IDRV>'+
 '</Administration8>'
 else ''    
 end +
 case when ISNULL(unite_9,'') + ISNULL(date_9,'') <> '' then
 '<Administration9>'+
 '<Unite>'+isnull(convert(varchar,Unite_9),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_9,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_9,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_9,'')+'</Initiale>'+
 '<Site>'+isnull(Site_9,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_9),'')+'</IDRV>'+
 '</Administration9>'
 else ''    
 end +
 case when ISNULL(unite_10,'') + ISNULL(date_10,'') <> '' then
 '<Administration10>'+
 '<Unite>'+isnull(convert(varchar,Unite_10),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_10,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_10,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_10,'')+'</Initiale>'+
 '<Site>'+isnull(Site_10,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_10),'')+'</IDRV>'+
 '</Administration10>'
 else ''
 end +
 case when ISNULL(unite_11,'') + ISNULL(date_11,'') <> '' then
 '<Administration11>'+
 '<Unite>'+isnull(convert(varchar,Unite_11),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_11,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_11,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_11,'')+'</Initiale>'+
 '<Site>'+isnull(Site_11,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_11),'')+'</IDRV>'+
 '</Administration11>'
 else ''
 end + 
  case when ISNULL(unite_12,'') + ISNULL(date_12,'') <> '' then
 '<Administration12>'+
 '<Unite>'+isnull(convert(varchar,Unite_12),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_12,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_12,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_12,'')+'</Initiale>'+
 '<Site>'+isnull(Site_12,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_12),'')+'</IDRV>'+
 '</Administration12>'
 else ''
 end +
  case when ISNULL(unite_13,'') + ISNULL(date_13,'') <> '' then
 '<Administration13>'+
 '<Unite>'+isnull(convert(varchar,Unite_13),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_13,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_13,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_13,'')+'</Initiale>'+
 '<Site>'+isnull(Site_13,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_13),'')+'</IDRV>'+
 '</Administration13>'
 else ''
 end +
 case when ISNULL(unite_14,'') + ISNULL(date_14,'') <> '' then
 '<Administration14>'+
 '<Unite>'+isnull(convert(varchar,Unite_14),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_14,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_14,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_14,'')+'</Initiale>'+
 '<Site>'+isnull(Site_14,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_14),'')+'</IDRV>'+
 '</Administration14>'
 else ''
 end +
 case when ISNULL(unite_15,'') + ISNULL(date_15,'') <> '' then
 '<Administration15>'+
 '<Unite>'+isnull(convert(varchar,Unite_15),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_15,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_15,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_15,'')+'</Initiale>'+
 '<Site>'+isnull(Site_15,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_15),'')+'</IDRV>'+
 '</Administration15>'
 else ''    
 end +
 case when ISNULL(unite_16,'') + ISNULL(date_16,'') <> '' then
 '<Administration16>'+
 '<Unite>'+isnull(convert(varchar,Unite_16),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_16,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_16,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_16,'')+'</Initiale>'+
 '<Site>'+isnull(Site_16,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_16),'')+'</IDRV>'+
 '</Administration16>'
 else ''    
 end +
 case when ISNULL(unite_17,'') + ISNULL(date_17,'') <> '' then
 '<Administration17>'+
 '<Unite>'+isnull(convert(varchar,Unite_17),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_17,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_17,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_17,'')+'</Initiale>'+
 '<Site>'+isnull(Site_17,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_17),'')+'</IDRV>'+
 '</Administration17>'
 else ''    
 end +
 case when ISNULL(unite_18,'') + ISNULL(date_18,'') <> '' then
 '<Administration18>'+
 '<Unite>'+isnull(convert(varchar,Unite_18),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_18,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_18,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_18,'')+'</Initiale>'+
 '<Site>'+isnull(Site_18,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_18),'')+'</IDRV>'+
 '</Administration18>'
 else ''    
 end +
 case when ISNULL(unite_19,'') + ISNULL(date_19,'') <> '' then
 '<Administration19>'+
 '<Unite>'+isnull(convert(varchar,Unite_19),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_19,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_19,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_19,'')+'</Initiale>'+
 '<Site>'+isnull(Site_19,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_19),'')+'</IDRV>'+
 '</Administration19>'
 else ''    
 end +
 case when ISNULL(unite_20,'') + ISNULL(date_20,'') <> '' then
 '<Administration20>'+
 '<Unite>'+isnull(convert(varchar,Unite_20),'')+'</Unite>'+
 '<Date>'+isnull(convert(varchar,Date_20,120),'')+'</Date>'+
 '<Texte>'+isnull(Texte_20,'')+'</Texte>'+
 '<Initiale>'+isnull(Initiale_20,'')+'</Initiale>'+
 '<Site>'+isnull(Site_20,'')+'</Site>'+
 '<Cancel></Cancel>'+
 '<IdNote></IdNote>'+
 '<IDRV>'+isnull(convert(varchar,IDRV_20),'')+'</IDRV>'+
 '</Administration20>'
 else ''
 end + '</IDObjet>'
 from  tmp_CarnetVac

这是错误:

Msg 9455,Niveau 16,État 1,Ligne 3 XML 解析:第 1 行,字符 80、非法限定名字符

感谢您的帮助!

【问题讨论】:

标签: sql sql-server xml tsql encoding


【解决方案1】:

您应该使用FOR XML PATH 创建您的XML!通过将字符串绑定在一起来做到这一点是一个非常糟糕的习惯,你真的应该避免!

向您解释正在发生的事情(可能):

我使用一个表变量来模拟一个带有值的表并插入两个“行”:

DECLARE @tbl TABLE(SomeText VARCHAR(100));
INSERT INTO @tbl VALUES
 ('This is some text.')
,('Even more ...');

这大致就是您正在做的事情:组合基于字符串的元素并将其转换为 XML。这实际上有效...

SELECT CAST('<Element>' + SomeText + '</Element>' AS XML)
FROM @tbl;

但现在我添加了一行,其中包含一个非法字符

INSERT INTO @tbl VALUES('Forbidden & character!'); --The & (ampersand) is forbidden (as well as <, > and some more)

同样的语句突然抛出“你的”错误。仅仅因为 & 符号 within 普通文本是被禁止的,必须转义。

SELECT CAST('<Element>' + SomeText + '</Element>' AS XML)
FROM @tbl;

根据您的问题,我们无法知道到底出了什么问题...可能是 &。 可能是错误位置的引号...可能是您需要 unicode 编码的特殊字符。可能足以以前导 N (N'string-literal') 开头所有字符串文字,并在任何地方使用 NVARCHAR 而不是 VARCHAR... 但这一切都不能解决真正的问题:不要通过以下方式创建 XML字符串连接!

你应该这样做:

SELECT SomeText
FROM @tbl
FOR XML PATH('row'),ROOT('root'),TYPE

如您所见,禁止字符已正确隐式转义:

<root>
  <row>
    <SomeText>This is some text.</SomeText>
  </row>
  <row>
    <SomeText>Even more ...</SomeText>
  </row>
  <row>
    <SomeText>Forbidden &amp; character!</SomeText>
  </row>
</root>

更新

我必须承认,我很确定,这并不能真正解决您的问题...而且我必须承认,您的整个查询有点味道...但是您的表现不足以进一步帮助您...

我建议开始一个新问题,在其中显示一些(减少的)样本数据和预期的输出。这可以 - 肯定 - 做得更好......

【讨论】:

  • 感谢 Shnugo 的回答。这对我很有帮助,也让我学到了很多东西。
  • 问题是我使用的是 VB6,但其中没有可使用的 xml 对象。我知道我的问题是关于 SQL 的,我已经找到了修复它的方法,但我知道这不是修复它的最佳方法。如果您知道网上有关 XML 的好教程,我将不胜感激。再次感谢您
  • @alexandre,我很高兴这对您有所帮助。要查找教程,只需搜索SQL Server FOR XML PATH tutorial 你会发现很多 :-) 由于上面是一个 T-SQL 脚本,不管它是由 VB6 创建的还是手动编写的,都无关紧要。它应该正确地写 :-) 带有编号列(unite_6unite_7、...)的整个结构都需要一个 1:n 相关的边桌。但你没有表现出足够的帮助你......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多