2008-11-07 33 views
23

是否有任何技巧可以阻止SQL Server使用類似&,<和>?的字符。我試圖輸出URL在我的XML文件,但SQL希望與「&amp;如何在SQL 2005上使用FOR XML PATH時保留&符號(&)

更換任何「&」以下面的查詢:

SELECT 'http://foosite.com/' + RTRIM(li.imageStore) 
     + '/ImageStore.dll?id=' + RTRIM(li.imageID) 
     + '&raw=1&rev=' + RTRIM(li.imageVersion) AS imageUrl 
FROM ListingImages li 
FOR XML PATH ('image'), ROOT ('images'), TYPE 

我得到的輸出是這樣的(& s的實體化):

<images> 
    <image> 
    <imageUrl>http://foosite.com/pics4/ImageStore.dll?id=7E92BA08829F6847&amp;raw=1&amp;rev=0</imageUrl> 
    </image> 
</images> 

我想這是(& s的不是實體化):

<images> 
    <image> 
    <imageUrl>http://foosite.com/pics4/ImageStore.dll?id=7E92BA08829F6847&raw=1&rev=0</imageUrl> 
    </image> 
</images> 

如何防止SQL服務器將'&'變爲'&amp;'?

回答

11

SQL Server生成的內容是正確的。你期望看到的不是格式良好的XML。原因是&字符表示實體引用的開始,例如&amp;。有關更多信息,請參見XML specification

當您的XML解析器從XML解析出這個字符串時,它會理解&amp;實體引用並以所需的形式返回文本,所以XML文件中的內部格式不應該給您帶來問題,除非您使用錯誤的XML解析器,或者試圖手動解析它(在這種情況下,您當前的解析器代碼現在與XML規範相關的實際上是錯誤的)。

44

有些情況下,某人可能不想要格式良好的XML - 我(也許是原始海報)遇到的一種情況是使用For XML Path技術通過遞歸查詢返回單個字段的「子」項目列表。關於該技術的更多信息,這裏(特別是在「黑盒XML方法」部分): Concatenating Row Values in Transact-SQL

對於我的情況下,看到1 H & E'(一個病理學染色)轉化爲「良好的XML」是一個真正的失望。幸運的是,我找到了一個解決方案......接下來的頁面幫助我相對簡單地解決了這個問題,無需重新設計我的遞歸查詢或在演示級別添加額外的解析(對於此以及其他未來情況,我的孩子-rows數據字段包含保留的XML字符):Handling Special Characters with FOR XML PATH


編輯:從引用的博客文章下面的代碼。

select 
    stuff(
    (select ', <' + name + '>' 
    from sys.databases 
    where database_id > 4 
    order by name 
    for xml path(''), root('MyString'), type 
    ).value('/MyString[1]','varchar(max)') 
    , 1, 2, '') as namelist; 
+0

這正是我一直在尋找。謝謝。 – Bob 2012-03-22 16:18:14

2

試試這個....

select 
    stuff( 
    (select ', <' + name + '>' 
    from sys.databases 
    where database_id > 4 
    order by name 
    for xml path(''), root('MyString'), type 
    ).value('/MyString[1]','varchar(max)') 
    , 1, 2, '') as namelist; 
相關問題