2017-03-16 54 views
0

我有一个返回XML的存储过程。 这是一个调查应用程序。TSQL - 非法xml字符

它遍历调查的所有问题和选择并返回XML。

但是,每当我尝试将问题文本包含在XML中时,我都会收到非法的xml字符错误。

我正在看所有的问题,并没有特殊字符,实际上唯一不是字母字符是问题结束的时期。

有什么我做错了吗?

这里是我的查询:

SET @root = (SELECT 
    CONVERT 
     (xml, 
      (
       SELECT q.QuestionId '@questionId' 
         ,q.DisplayOrder '@orderId' 
         ,q.IsRequired '@required' 
         ,q.Weight '@weight' 
         ,CONVERT(xml, 
            (
             SELECT  
              qc.QuestionId '@questionId' 
              ,qc.DisplayOrder '@orderId' 
              ,(SELECT REPLACE((SELECT REPLACE((SELECT REPLACE((SELECT REPLACE((SELECT REPLACE(qc.[Description] ,'&','&amp;')),'''','&apos;')),'"','&quot;')),'<','&lt;')),'>','&gt;')) 
             FROM survey.Question qc 
             WHERE qc.QuestionId = q.QuestionId 
             FOR XML PATH ('question') 
            ) 
         ) 
         ,CONVERT(xml, 
            (
             SELECT  
              qc.QuestionChoiceId '@choiceId' 
              ,qc.DisplayOrder '@orderId' 
              ,qc.Weight '@weight' 
              ,ISNULL(qc.Description,'') '@description' 
             FROM survey.QuestionChoice qc 
             WHERE qc.QuestionId = q.QuestionId 
             FOR XML PATH ('choice'), type, root('choices') 
            ) 
         ) 

       FROM survey.Question q 
       WHERE q.SectionId = @SectionId 
       FOR XML PATH('questionset') 
      ) 
     )) 

如果我代替我的“消毒”的SELECT语句,并用硬编码的文本替换,我的查询工作正常。

以下是来自数据库的一些示例问题。

任何额外的评论或建议的赞赏:

的分类器 是礼貌和专业。

评分员提供了很好的理由 他们的评估。

+2

我们真的做一些触发问题的示例数据,并且不需要执行任何手动实体替换 –

+0

为什么我不应该执行实体替换?是否自动处理?请参阅已更新的示例数据问题 – Mark

+1

是的,工具需要关心XML ES遮盖要求 - 例如运行'选择'A&B'作为xml路径的[@fido],root('def')'并检查输出。通过示例数据,我希望创建一些完整的脚本来创建一些表结构(表变量通常可以工作)并插入。优选地,在减少的一组列上(然后用减少的查询)这足以证明相同的错误 - 例如, a [mcve] –

回答

-1

那些(SELECT REPLACE((不需要SELECT REPLACE((...语句只是使用嵌套的替换功能,如:。

(REPLACE((REPLACE((REPLACE((REPLACE((REPLACE(qc.[Description] ,'&','&amp;')),'''','&apos;')),'"','&quot;')),'<','&lt;')),'>','&gt;')) 

或用更少的括号:

(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE([FileName] ,'&','&amp;'),'''','&apos;'),'"','&quot;'),'<','&lt;'),'>','&gt;')) 
+0

你能解释一下你的答案吗?看起来你只是缩短我的替换声明。它是否正确? – Mark

+0

不是?它似乎为我工作没有问题? – Mark

+1

@GordonBell - 你认为他们是“无效的”? 'select replace((select select('abc','b','g')),'c','f')'执行得很好并生成字符串'agf'。它不像它那样美丽,但距离不工作还有很长的路要走。 –