2012-02-16 59 views
11

我有一個名爲Map_Data表和數據的樣子:額外字符,而使用XML PATH

ID SoCol                Descol 
125 case Per_rating when 5 then 'Good' when 4 then 'Ok' else null end D_Code 

,我寫了這個特定行的查詢和查詢:

SELECT Params = (SELECT DesCol + ' = ''' + SoCol + '''' 
        FROM  dbo.Map_Data t1 
        WHERE ID = 125 
        FOR 
        XML PATH('') 
       ) 

和我得到的輸出:

D_Code = 'case per_rating
 when 5 then 'Good'
 when 4
 then 'Ok'
 end' 

誰能告訴我爲什麼我收到'
'它,我該如何糾正呢?

+1

查看Mapdata的內容,我認爲裏面有#13(Carriage Returns)。無論您用什麼來顯示錶格內容,它們都可能不可見。鑑於他們在哪裏它看起來SoCol被美化。 – 2012-02-16 16:19:50

回答

15

這種輕微的變化將使醜陋的實體消失,但他們不會消除回車(看看結果結果以文本,而不是結果網格,看到他們):

SELECT Params = (SELECT DesCol + ' = ''' + SoCol + '''' 
        FROM  dbo.Map_Data t1 
        WHERE ID = 125 
        FOR 
        XML PATH(''), TYPE 
       ).value('.[1]', 'nvarchar(max)'); 

如果你想擺脫CR/LF太多,你可以說:

SELECT Params = (SELECT REPLACE(REPLACE(DesCol + ' = ''' + SoCol + '''', 
    CHAR(13), ''), CHAR(10), '') 
        FROM  dbo.Map_Data t1 
        WHERE ID = 125 
        FOR 
        XML PATH(''), TYPE 
       ).value('.[1]', 'nvarchar(max)'); 

而且我不知道你將如何使用輸出,但如果你要使用動態評估後它SQL你將需要用兩個單引號替換嵌入的單引號(') ('')。否則它會炸燬,因爲它們也是字符串分隔符。

+0

非常感謝你! – peter 2012-02-16 17:19:55

+0

請注意,使用'.value'比沒有使用要慢。我有一個UDF充滿了這樣的調用,它造成了相當多的性能問題。 – Sebazzz 2017-01-19 21:16:32

+0

@Sebazz太好了。你能否展示如何在不使用'.value'的情況下獲得相同的輸出? – 2017-01-20 01:12:24

0

您也可以通過將單引號中的所有代碼保留在一行中來實現此目的。我也有類似的問題,並通過保持所有代碼在一行中解決。