2016-03-02 255 views
0

我正在使用SQL Server 2008 R2作爲後端。數據庫中的其中一個表具有文本類型的字段。表格中只有一個字段。 該表由填充單個文本字段中的字符串列表的應用程序填充。出於某種原因,應用程序已經開始在文本中添加一些奇怪的字符。因此它在文本的一行中顯示爲單個特殊字符。 對於例如:從sql列刪除符合某些條件的行

abc 
def 
$ 
ghi 
& 
jkl 

現在整個上面的字符串被存儲在一列項,有許多這樣的條目。 我想知道如何寫一個SQL更新或替換查詢從列條目中去除特殊字符。所以在運行查詢後,連續輸出應該是

abc 
def 
ghi 
jkl 

任何幫助表示讚賞。由於

+0

是特殊字符限制爲「$」和'&',還是一個有點小的名單? –

+0

在現有列表的這個位置的成員是* good *的字符串?或者換句話說:一些邏輯應該怎麼知道,哪些條目是好的,哪些是壞的? – Shnugo

+0

不,還有很多其他的角色,比如',〜,Ÿ,Š。但有一點很常見,它們是單個字符,我可以刪除長度爲1個字符的任何東西。 –

回答

2

試試這樣說:

DECLARE @LineBreak VARCHAR(2)=CHAR(13)+CHAR(10); --might be only 10 or only 13... 

DECLARE @yourString VARCHAR(MAX)= 
'abc 
def 
$ 
ghi 
& 
jkl'; 

SELECT The.Parts.value('.','varchar(max)') 
FROM (SELECT CAST('<x>' + REPLACE(REPLACE(REPLACE(REPLACE(@yourString,'<','&lt;'),'>','&gt;'),'&','&amp;'),@LineBreak,'</x><x>') + '</x>' AS XML)) AS MyString(AsXml) 
CROSS APPLY MyString.AsXml.nodes('x') AS The(Parts) 
WHERE LEN(The.Parts.value('.','varchar(max)'))>1 

如果需要再次連接起來,以打破單一的串線的結果,使用這個選擇

SELECT REPLACE(STUFF 
(
    (
    SELECT 'HereTheLineBreak' + The.Parts.value('.','varchar(max)') 
    FROM (SELECT CAST('<x>' + REPLACE(REPLACE(REPLACE(REPLACE(@yourString,'<','&lt;'),'>','&gt;'),'&','&amp;'),@LineBreak,'</x><x>') + '</x>' AS XML)) AS MyString(AsXml) 
    CROSS APPLY MyString.AsXml.nodes('x') AS The(Parts) 
    WHERE LEN(The.Parts.value('.','varchar(max)'))>1 
    FOR XML PATH('') 
    ),1,16,''),'HereTheLineBreak',@LineBreak) 
+0

這工作完美。謝謝!! –