TSQL - 非法的xml字符

时间:2017-03-16 13:55:47

标签: sql-server 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')
            )
        ))

如果我替换我的“清理”选择语句,并用硬编码文本替换,我的查询工作正常。

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

感谢任何其他意见或建议:

优等生    很有礼貌和专业。

优等生提供了很好的理由    他们的评估。

2 个答案:

答案 0 :(得分:0)

您需要将 TYPE 指令指定为以下脚本。

FOR XML PATH(''), TYPE).value('.', 'varchar(max)')

答案 1 :(得分:-1)

那些(SELECT REPLACE((SELECT REPLACE((...不需要语句。只需使用嵌套的REPLACE函数,如:

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

或括号少:

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