2010-08-20 145 views
6

我在數據庫中有一列(SQL Server 2005),數據在最後有一個「\ 0」。在SQL Server中查詢時,該字符不可見,也不「看起來」存在。當我查看我的C#代碼時,角色就在那裏。此人物在我們的網站上造成錯誤,我們需要將其從所有受影響的行中移除。Sql Server - 從數據中刪除結束字符串字符「 0」

是否有我可以寫入的sql查詢輕鬆地從受影響的所有記錄中刪除此字符?我可以獲取所有受影響的記錄,但我沒有辦法將記錄更新爲新值(沒有「\ 0」)。

UPDATE: 這似乎工作:

Select * from TABLE 
where UNICODE(SUBSTRING(naughtyField, LEN(naughtyField), 1)) = 0 

所以:

Update TABLE 
SET naughtyField = SUBSTRING(naughtyField, 1, LEN(naughtyField) - 1) 
where UNICODE(SUBSTRING(naughtyField, LEN(naughtyField), 1)) = 0 
+0

那麼,我該怎麼做?威爾的回答是不正確的,但他的幫助使我找到了解決辦法。 – Martin 2010-08-20 18:03:29

+0

如果Will將他關於使用'SUBSTRING(naughtyfield,1,LEN(naughtyfield)1)'的評論轉移到他的答案中來解決問題嗎? – 2010-08-20 18:06:19

+0

是的...雖然你的答案更優雅,但我不認爲我可以在Prod數據庫上創建一個功能,只是爲了「快速修復」。文書工作太多。 – Martin 2010-08-20 18:08:14

回答

4

是否......

UPDATE mytable 
SET myfield = REPLACE(myfield, CHAR(0), '') 

...工作?

SUBSTRING(naughtyfield, 1, LEN(naughtyfield) - 1)在那些空終止的作品 - 但要小心不要使用它在非NULL終止的字符串或您將丟失數據。

+0

從我的快速測試。 'create table #t(col varchar(50))insert into #t values('hgjh'+ char(0)+'gghg')UPDATE #t SET col = REPLACE(col,char(0),'') – 2010-08-20 17:33:56

+0

LEN(naughtyfield)是否返回包含MSSQL中null結束符的長度? – 2010-08-20 17:36:03

+0

是的,Len('列中的字符串')= X,Len(naughtyfield)= X + 1 – Martin 2010-08-20 17:37:56

10

UPDATE TBL SET列= REPLACE(COL,CHAR(0), '')

編輯:只爲贖回這個答案!可能對字符串嵌入的更一般情況有用。

CREATE FUNCTION dbo.RemoveNullChars 
(
    @string NVARCHAR(MAX) 
) 
RETURNS NVARCHAR(MAX) WITH RETURNS NULL ON NULL INPUT 
AS 
BEGIN 
DECLARE @Result NVARCHAR(MAX) 
SET @Result = '' 

DECLARE @counter INT 

SET @counter = 0 

WHILE (@counter <= LEN(@string)) 
    BEGIN 
    IF UNICODE(SUBSTRING(@string,@counter,1)) <> 0 
     SET @Result = @Result + SUBSTRING(@string,@counter,1) 
    SET @counter = @counter + 1  
    END 
RETURN @Result 
END 

然後

UPDATE tbl SET col = dbo.RemoveNullChars (col) 
+0

謝謝!做得好! – dyatchenko 2016-09-29 22:33:10

1

我遇到了這個問題,最近修復了它。它似乎總是在一個字符串的末尾(因爲它是一個終結符字符)。

而且,因爲它不是一個空白,它會導致RTRIM不上有多餘的尾隨空格領域工作(例如 '加州                        \ 0')。

去除最安全的方法是(0)向子串(「\ 0」或字符串長度的最後一個索引,如果「\ 0」未找到)

這裏是我如何安全地刪除它我的情況

substring([field], 0, (LEN([field]) - CHARINDEX(char(0), REVERSE([field])) + 1)) 

這裏是刪除它,也修剪額外的空間。

ltrim(rtrim(substring([field], 0, (LEN([field]) - CHARINDEX(char(0), REVERSE([field])) + 1))))