2010-08-15 5 views
38

У меня есть таблица в базе данных SQL Server 2008. В этой таблице есть столбец nvarchar (256) с именем «Name». К сожалению, значения в этом поле содержат дополнительные пробелы. Например, имя «Билл» фактически хранится как «Билл» в таблице.Обрезка текстовых строк в SQL Server 2008

Я хочу обновить все записи в этой таблице, чтобы удалить лишние пробелы. Однако я с удивлением узнал, что SQL не имеет функции TRIM.

Как обновить все записи за раз, чтобы удалить лишние пробелы?

Спасибо!

ответ

84

У вас есть RTRIM и функция LTRIM. Вы можете комбинировать их, чтобы получить нужную функцию отделки.

UPDATE Table 
SET Name = RTRIM(LTRIM(Name)) 
16

Вы можете использовать функцию RTrim, чтобы обрезать все пробелы справа. Используйте LTrim, чтобы обрезать все пробелы слева. Например

UPDATE Table SET Name = RTrim(Name) 

Или для левой и правой подрезать

UPDATE Table SET Name = LTrim(RTrim(Name)) 
+0

Этот ответ должен быть принят один, потому что 'LTRIM (RTRIM (Name))', вероятно, более эффективным, чем 'RTRIM (LTRIM (Name))'. – mark

+2

@mark: любая ссылка для указанной точки? – BiLaL

+2

Ну, это зависит от языка внутренней реализации. Если это C/C++, то LTRIM должен сдвигать строковые символы влево, тогда как RTRIM просто записывает завершающий «\ 0» в правильное положение. Таким образом, LTRIM после RTRIM должен сдвигать меньше символов. Конечно, это не имеет большого значения в общей картине, но все же это более эффективно, и стоимость обмена LTRIM и RTRIM абсолютно равна 0. – mark

4

SQL Server не имеет функции TRIM, а это два. Каждый из них специально предназначен для отсечения пробелов из «фронта» строки (LTRIM) и один для отсечения пробелов от «конца» строки (RTRIM).

Что-то вроде следующего будет обновлять каждую запись в вашей таблице, зачистка всего постороннего пространства (либо на фронте или в конце) поля VARCHAR/NVARCHAR:

UPDATE 
    [YourTableName] 
SET 
    [YourFieldName] = LTRIM(RTRIM([YourFieldName])) 

(Как ни странно, SSIS (SQL Server Integration Services) делает имеет одну TRIM функции!)

1

Я знаю, что это старый вопрос, но я только что нашел решение, которое создает определенный пользователь функцию, используя LTRIM и RTRIM. Он не обрабатывает двойные пробелы в середине строки.

Решение, однако, прямо вперед:

User Defined Trim Function

0

Нет ответа верно

Истинный Ответ Редактировать Колонка для NVARCHAR и вы нашли Автоматически обрезать Execute, но этот код UPDATE Таблица SET Имя = RTRIM (LTRIM (Name)) использовать его только с Nvarchar, если использовать его с CHAR или NCHAR, он не будет работать

+0

Что вы ожидаете? С CHAR и NCHAR строка имеет фиксированную длину. Если вы обрезаете последние пустые 10 символов CHAR (30) и снова назначите его CHAR (30), строка будет заполнена до 30 символов снова, используя пробелы. – Christoph

0

Эта функция обрезает строку слева и справа. Также он удаляет возврат каретки из строки, действие, которое не делается по LTRIM и RTRIM

IF OBJECT_ID(N'dbo.TRIM', N'FN') IS NOT NULL 
    DROP FUNCTION dbo.TRIM; 
GO 
CREATE FUNCTION dbo.TRIM (@STR NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) 
BEGIN 
    RETURN(LTRIM(RTRIM(REPLACE(REPLACE(@STR ,CHAR(10),''),CHAR(13),'')))) 
END; 
GO 
+0

Проблема с вашей функцией в том, что она не обрезает CRLF, они также заменяются внутри строки, которая, вероятно, нежелательна. – Christoph

0

Я хотел бы попробовать что-то подобное для уравновешивания функции, которая принимает во внимание все пробельные символы, определенные в Unicode Стандарт (LTRIM и RTRIM даже не обрезают символы новой строки!):

IF OBJECT_ID(N'dbo.IsWhiteSpace', N'FN') IS NOT NULL 
 
    DROP FUNCTION dbo.IsWhiteSpace; 
 
GO 
 

 
-- Determines whether a single character is white-space or not (according to the UNICODE standard). 
 
CREATE FUNCTION dbo.IsWhiteSpace(@c NCHAR(1)) RETURNS BIT 
 
BEGIN 
 
\t IF (@c IS NULL) RETURN NULL; 
 
\t DECLARE @WHITESPACE NCHAR(31); 
 
\t SELECT @WHITESPACE = ' ' + NCHAR(13) + NCHAR(10) + NCHAR(9) + NCHAR(11) + NCHAR(12) + NCHAR(133) + NCHAR(160) + NCHAR(5760) + NCHAR(8192) + NCHAR(8193) + NCHAR(8194) + NCHAR(8195) + NCHAR(8196) + NCHAR(8197) + NCHAR(8198) + NCHAR(8199) + NCHAR(8200) + NCHAR(8201) + NCHAR(8202) + NCHAR(8232) + NCHAR(8233) + NCHAR(8239) + NCHAR(8287) + NCHAR(12288) + NCHAR(6158) + NCHAR(8203) + NCHAR(8204) + NCHAR(8205) + NCHAR(8288) + NCHAR(65279); 
 
\t IF (CHARINDEX(@c, @WHITESPACE) = 0) RETURN 0; 
 
\t RETURN 1; 
 
END 
 
GO 
 

 
IF OBJECT_ID(N'dbo.Trim', N'FN') IS NOT NULL 
 
    DROP FUNCTION dbo.Trim; 
 
GO 
 

 
-- Removes all leading and tailing white-space characters. NULL is converted to an empty string. 
 
CREATE FUNCTION dbo.Trim(@TEXT NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) 
 
BEGIN 
 
\t -- Check tiny strings (NULL, 0 or 1 chars) 
 
\t IF @TEXT IS NULL RETURN N''; 
 
\t DECLARE @TEXTLENGTH INT = LEN(@TEXT); 
 
\t IF @TEXTLENGTH < 2 BEGIN 
 
\t \t IF (@TEXTLENGTH = 0) RETURN @TEXT; 
 
\t \t IF (dbo.IsWhiteSpace(SUBSTRING(@TEXT, 1, 1)) = 1) RETURN ''; 
 
\t \t RETURN @TEXT; 
 
\t END 
 
\t -- Check whether we have to LTRIM/RTRIM 
 
\t DECLARE @SKIPSTART INT; 
 
\t SELECT @SKIPSTART = dbo.IsWhiteSpace(SUBSTRING(@TEXT, 1, 1)); 
 
\t DECLARE @SKIPEND INT; 
 
\t SELECT @SKIPEND = dbo.IsWhiteSpace(SUBSTRING(@TEXT, @TEXTLENGTH, 1)); 
 
\t DECLARE @INDEX INT; 
 
\t IF (@SKIPSTART = 1) BEGIN 
 
\t \t IF (@SKIPEND = 1) BEGIN 
 
\t \t \t -- FULLTRIM 
 
\t \t \t -- Determine start white-space length 
 
\t \t \t SELECT @INDEX = 2; 
 
\t \t \t WHILE (@INDEX < @TEXTLENGTH) BEGIN -- Hint: The last character is already checked 
 
\t \t \t \t -- Stop loop if no white-space 
 
\t \t \t \t IF (dbo.IsWhiteSpace(SUBSTRING(@TEXT, @INDEX, 1)) = 0) BREAK; 
 
\t \t \t \t -- Otherwise assign index as @SKIPSTART 
 
\t \t \t \t SELECT @SKIPSTART = @INDEX; 
 
\t \t \t \t -- Increase character index 
 
\t \t \t \t SELECT @INDEX = (@INDEX + 1); 
 
\t \t \t END 
 
\t \t \t -- Return '' if the whole string is white-space 
 
\t \t \t IF (@SKIPSTART = (@TEXTLENGTH - 1)) RETURN ''; 
 
\t \t \t -- Determine end white-space length 
 
\t \t \t SELECT @INDEX = (@TEXTLENGTH - 1); 
 
\t \t \t WHILE (@INDEX > 1) BEGIN 
 
\t \t \t \t -- Stop loop if no white-space 
 
\t \t \t \t IF (dbo.IsWhiteSpace(SUBSTRING(@TEXT, @INDEX, 1)) = 0) BREAK; 
 
\t \t \t \t -- Otherwise increase @SKIPEND 
 
\t \t \t \t SELECT @SKIPEND = (@SKIPEND + 1); 
 
\t \t \t \t -- Decrease character index 
 
\t \t \t \t SELECT @INDEX = (@INDEX - 1); 
 
\t \t \t END 
 
\t \t \t -- Return trimmed string 
 
\t \t \t RETURN SUBSTRING(@TEXT, @SKIPSTART + 1, @TEXTLENGTH - @SKIPSTART - @SKIPEND); 
 
\t \t END 
 
\t \t -- LTRIM 
 
\t \t -- Determine start white-space length 
 
\t \t SELECT @INDEX = 2; 
 
\t \t WHILE (@INDEX < @TEXTLENGTH) BEGIN -- Hint: The last character is already checked 
 
\t \t \t -- Stop loop if no white-space 
 
\t \t \t IF (dbo.IsWhiteSpace(SUBSTRING(@TEXT, @INDEX, 1)) = 0) BREAK; 
 
\t \t \t -- Otherwise assign index as @SKIPSTART 
 
\t \t \t SELECT @SKIPSTART = @INDEX; 
 
\t \t \t -- Increase character index 
 
\t \t \t SELECT @INDEX = (@INDEX + 1); 
 
\t \t END 
 
\t \t -- Return trimmed string 
 
\t \t RETURN SUBSTRING(@TEXT, @SKIPSTART + 1, @TEXTLENGTH - @SKIPSTART); 
 
\t END ELSE BEGIN 
 
\t \t -- RTRIM 
 
\t \t IF (@SKIPEND = 1) BEGIN 
 
\t \t \t -- Determine end white-space length 
 
\t \t \t SELECT @INDEX = (@TEXTLENGTH - 1); 
 
\t \t \t WHILE (@INDEX > 1) BEGIN 
 
\t \t \t \t -- Stop loop if no white-space 
 
\t \t \t \t IF (dbo.IsWhiteSpace(SUBSTRING(@TEXT, @INDEX, 1)) = 0) BREAK; 
 
\t \t \t \t -- Otherwise increase @SKIPEND 
 
\t \t \t \t SELECT @SKIPEND = (@SKIPEND + 1); 
 
\t \t \t \t -- Decrease character index 
 
\t \t \t \t SELECT @INDEX = (@INDEX - 1); 
 
\t \t \t END 
 
\t \t \t -- Return trimmed string 
 
\t \t \t RETURN SUBSTRING(@TEXT, 1, @TEXTLENGTH - @SKIPEND); 
 
\t \t END 
 
\t END 
 
\t -- NO TRIM 
 
\t RETURN @TEXT; 
 
END 
 
GO

Смежные вопросы