Удалить завершающий пробел в содержимом поля

Я использую SQL-сервер MSDE 2000. У меня есть поле с именем notes типа nvarchar(65).

Содержимое «Что-то» с дополнительным пробелом после содержимого (кавычки для ясности) во всех записях. Я использовал следующую команду.

UPDATE TABLE1 
   SET notes = RTRIM(LTRIM(notes))

Но это не работает. Есть ли альтернативный способ сделать это?


person bdhar    schedule 08.12.2009    source источник
comment
что значит не работает? Должно ....   -  person Mitch Wheat    schedule 08.12.2009
comment
Нет уверенности. Запрос выполняется правильно, и я получаю сообщение «(12539 строк затронуто)». Но поле по-прежнему имеет значение с завершающим пробелом.   -  person bdhar    schedule 08.12.2009
comment
вы смотрите на правильный экземпляр сервера, таблицу ?? Я делал это раньше...   -  person Mitch Wheat    schedule 08.12.2009
comment
RTRIM должен работать нормально. Вы уверены, что символ после этого на самом деле является пробелом? Возможно, вы захотите проверить используемую сортировку и значение байта.   -  person womp    schedule 08.12.2009


Ответы (3)


Вы уверены, что запрос не работает? Пытаться:

SELECT TOP 100 '~'+ t.notes +'~'
  FROM TABLE1 t

TOP 100 ограничит результаты первыми 100 строками, этого достаточно, чтобы понять, действительно ли в выводе есть место. Если есть, и RTRIM/LTRIM не удаляет его, значит, вы имеете дело не с пробельным символом. В этом случае попробуйте:

UPDATE TABLE1
  SET notes = REPLACE(notes, 
                      SUBSTRING(notes, PATINDEX('%[^a-zA-Z0-9 '''''']%', notes), 1), 
                      '')
WHERE PATINDEX('%[^a-zA-Z0-9 '''''']%', notes) <> 0
person OMG Ponies    schedule 08.12.2009
comment
Этот работает. В чем разница между этим и тем, что я использовал? - person bdhar; 08.12.2009
comment
@Bharanidharan: он удаляет непечатаемые символы ASCII, которых нет в LTRIM/RTRIM. - person OMG Ponies; 08.12.2009
comment
Отлично. Что такое непечатаемый символ ACSII? Отличается ли оно от пустого места? - person bdhar; 08.12.2009
comment
Первые 32 значения являются непечатаемыми управляющими символами, такими как возврат каретки (десятичное значение 13) и перевод строки (десятичное значение 10): csgnetwork.com/asciiset.html - person OMG Ponies; 08.12.2009

... ИЛИ вы можете буквально просто скопировать/вставить пробел ' ' (пробел) в конце поля в результате вашего запроса в оператор замены и обновить все оттуда.

update TABLE1
set notes = replace(notes, ' ', '')
person Derrik    schedule 10.09.2013

И на всякий случай, если вам нужно ОБРЕЗАТЬ все пробелы во всех столбцах, вы можете использовать этот скрипт, чтобы сделать это динамически:

--Just change table name
declare @MyTable varchar(100)
set @MyTable = 'MyTable'

--temp table to get column names and a row id
select column_name, ROW_NUMBER() OVER(ORDER BY column_name) as id into #tempcols from INFORMATION_SCHEMA.COLUMNS 
WHERE   DATA_TYPE IN ('varchar', 'nvarchar') and TABLE_NAME = @MyTable

declare @tri int
select @tri = count(*) from #tempcols
declare @i int
select @i = 0
declare @trimmer nvarchar(max)
declare @comma varchar(1)
set @comma = ', '

--Build Update query
select @trimmer = 'UPDATE [dbo].[' + @MyTable + '] SET '

WHILE @i <= @tri 
BEGIN

    IF (@i = @tri)
        BEGIN
        set @comma = ''
        END
    SELECT  @trimmer = @trimmer + CHAR(10)+ '[' + COLUMN_NAME + '] = LTRIM(RTRIM([' + COLUMN_NAME + ']))'+@comma
    FROM    #tempcols
    where id = @i

    select @i = @i+1
END

--execute the entire query
EXEC sp_executesql @trimmer

drop table #tempcols
person Hiram    schedule 07.03.2014