Sql Server - удалить символ конца строки "\ 0" из данных - PullRequest
7 голосов
/ 20 августа 2010

У меня есть столбец в базе данных (SQL Server 2005), в котором есть данные с "\ 0" в конце. При запросе в SQL Server этот символ не отображается и, кажется, не существует. Когда я смотрю в своем коде C #, персонаж там. Этот символ вызывает ошибку на нашем веб-сайте, и нам нужно, чтобы она была удалена из всех затронутых строк.

Можно ли написать 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

Ответы [ 3 ]

10 голосов
/ 20 августа 2010

ОБНОВЛЕНИЕ tbl SET col = ЗАМЕНА (col, char (0), '')

Редактировать: Просто чтобы выкупить этот ответ!Может быть полезно для более общего случая, когда в строку внедрены \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)
4 голосов
/ 20 августа 2010

ли ...

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

... работа

SUBSTRING(naughtyfield, 1, LEN(naughtyfield) - 1) в тех полях, которые завершаются нулем, но будьте осторожны, не используйте его в строках, не заканчивающихся NULL, иначе вы потеряете данные.

2 голосов
/ 24 июня 2014

Я столкнулся с этой проблемой и недавно исправил ее. Кажется, это всегда в конце строки (так как это символ-терминатор).

Кроме того, поскольку это не пробел, он заставляет rtrim не работать с полями, в которых есть дополнительные пробелы (например, «California \ 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 ) ) ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...