2010-08-20 26 views
6

Tôi có một cột trong cơ sở dữ liệu (SQL Server 2005) có dữ liệu có dấu "\ 0" ở cuối. Khi truy vấn trong SQL Server, ký tự này không hiển thị và không "có vẻ" tồn tại. Khi tôi nhìn vào mã C# của tôi, nhân vật ở đó. Nhân vật này đang gây ra lỗi trên trang web của chúng tôi và chúng tôi cần xóa nó khỏi tất cả các hàng bị ảnh hưởng.Sql Server - Xóa ký tự chuỗi cuối " 0" Từ dữ liệu

Có truy vấn sql nào tôi có thể viết để dễ dàng xóa ký tự này khỏi tất cả các bản ghi bị ảnh hưởng không? Tôi có thể nhận được tất cả các hồ sơ bị ảnh hưởng, nhưng tôi không có cách nào để cập nhật bản ghi thành một giá trị mới (không có "\ 0").

UPDATE: Điều này dường như làm việc:

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

Vì vậy:

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

Vì vậy, làm cách nào để thực hiện việc này? Câu trả lời của Will là không đúng, nhưng sự giúp đỡ của anh ta đã dẫn tôi đến giải pháp của tôi. – Martin

+0

Nếu Will di chuyển nhận xét của mình về việc sử dụng 'SUBSTRING (naughtyfield, 1, LEN (naughtyfield) - 1)' vào câu trả lời của anh ta có nên giải quyết vấn đề? –

+0

Vâng ... mặc dù câu trả lời của bạn là thanh lịch hơn, tôi không nghĩ rằng tôi có thể tạo ra một chức năng trên cơ sở dữ liệu Prod chỉ cho "sửa chữa nhanh chóng" này. Quá nhiều giấy tờ. – Martin

Trả lời

4

Liệu ...

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

... làm việc?

SUBSTRING(naughtyfield, 1, LEN(naughtyfield) - 1) trên các trường đó là các tác phẩm không được chấm dứt - nhưng hãy cẩn thận không sử dụng nó trên các chuỗi bị chấm dứt không NULL hoặc bạn sẽ mất dữ liệu.

+0

No.Từ bài kiểm tra nhanh của tôi. 'tạo bảng #t (col varchar (50)) chèn vào các giá trị #t ('hgjh' + char (0) + 'gghg') CẬP NHẬT #t SET col = REPLACE (col, char (0), '')' –

+0

LEN (naughtyfield) có trả về độ dài bao gồm null-terminator trong MSSQL không? –

+0

Có, Len ('Chuỗi trong cột') = X, Len (naughtyfield) = X + 1 – Martin

10

CẬP NHẬT tbl SET col = REPLACE (col, char (0), '')

Chỉnh sửa: Chỉ cần đổi câu trả lời này! Có thể hữu ích cho trường hợp tổng quát hơn mà một chuỗi đã nhúng \0 s.

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 

Sau đó

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

Cảm ơn! Làm tốt lắm! – dyatchenko

1

Tôi gặp sự cố này và khắc phục sự cố gần đây. Có vẻ như nó luôn luôn ở cuối một chuỗi (vì nó là một ký tự terminator).

Ngoài ra, bởi vì nó không phải là một khoảng trắng, nó gây ra rtrim không làm việc trên các lĩnh vực mà có các khoảng trống dấu thêm (ví dụ 'California                         \ 0').

Cách an toàn nhất để loại bỏ điều này là để substring từ (0) đến (chỉ số cuối cùng của chiều dài '\ 0' OR chuỗi nếu '\ 0' không tìm thấy)

Dưới đây là cách tôi một cách an toàn loại bỏ nó trong trường hợp của tôi

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

Và đây là loại bỏ nó và cũng cắt tỉa thêm không gian.

ltrim(rtrim(substring([field], 0, (LEN([field]) - CHARINDEX(char(0), REVERSE([field])) + 1)))) 
Các vấn đề liên quan