2017-03-16 55 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'。它不像它那樣美麗,但距離不工作還有很長的路要走。 –