Обрезка текстовых строк в SQL Server 2008 - PullRequest
43 голосов
/ 15 августа 2010

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

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

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

Спасибо!

Ответы [ 7 ]

97 голосов
/ 15 августа 2010

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

UPDATE Table
SET Name = RTRIM(LTRIM(Name))
16 голосов
/ 15 августа 2010

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

UPDATE Table SET Name = RTrim(Name)

или для левой и правой отделки

UPDATE Table SET Name = LTrim(RTrim(Name))
4 голосов
/ 15 августа 2010

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

Примерно следующее будет обновлять каждую запись в вашей таблице, обрезая все посторонние места (в начале или в конце) поля varchar / nvarchar:

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

(странно, SSIS (Sql Server Integration Services) имеет единственную TRIM функцию!)

2 голосов
/ 17 мая 2017

Я бы попробовал что-то подобное для функции Trim, которая учитывает все символы пробела, определенные стандартом 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
	IF (@c IS NULL) RETURN NULL;
	DECLARE @WHITESPACE NCHAR(31);
	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);
	IF (CHARINDEX(@c, @WHITESPACE) = 0) RETURN 0;
	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
	-- Check tiny strings (NULL, 0 or 1 chars)
	IF @TEXT IS NULL RETURN N'';
	DECLARE @TEXTLENGTH INT = LEN(@TEXT);
	IF @TEXTLENGTH < 2 BEGIN
		IF (@TEXTLENGTH = 0) RETURN @TEXT;
		IF (dbo.IsWhiteSpace(SUBSTRING(@TEXT, 1, 1)) = 1) RETURN '';
		RETURN @TEXT;
	END
	-- Check whether we have to LTRIM/RTRIM
	DECLARE @SKIPSTART INT;
	SELECT @SKIPSTART = dbo.IsWhiteSpace(SUBSTRING(@TEXT, 1, 1));
	DECLARE @SKIPEND INT;
	SELECT @SKIPEND = dbo.IsWhiteSpace(SUBSTRING(@TEXT, @TEXTLENGTH, 1));
	DECLARE @INDEX INT;
	IF (@SKIPSTART = 1) BEGIN
		IF (@SKIPEND = 1) BEGIN
			-- FULLTRIM
			-- Determine start white-space length
			SELECT @INDEX = 2;
			WHILE (@INDEX < @TEXTLENGTH) BEGIN -- Hint: The last character is already checked
				-- Stop loop if no white-space
				IF (dbo.IsWhiteSpace(SUBSTRING(@TEXT, @INDEX, 1)) = 0) BREAK;
				-- Otherwise assign index as @SKIPSTART
				SELECT @SKIPSTART = @INDEX;
				-- Increase character index
				SELECT @INDEX = (@INDEX + 1);
			END
			-- Return '' if the whole string is white-space
			IF (@SKIPSTART = (@TEXTLENGTH - 1)) RETURN ''; 
			-- Determine end white-space length
			SELECT @INDEX = (@TEXTLENGTH - 1);
			WHILE (@INDEX > 1) BEGIN 
				-- Stop loop if no white-space
				IF (dbo.IsWhiteSpace(SUBSTRING(@TEXT, @INDEX, 1)) = 0) BREAK;
				-- Otherwise increase @SKIPEND
				SELECT @SKIPEND = (@SKIPEND + 1);
				-- Decrease character index
				SELECT @INDEX = (@INDEX - 1);
			END
			-- Return trimmed string
			RETURN SUBSTRING(@TEXT, @SKIPSTART + 1, @TEXTLENGTH - @SKIPSTART - @SKIPEND);
		END 
		-- LTRIM
		-- Determine start white-space length
		SELECT @INDEX = 2;
		WHILE (@INDEX < @TEXTLENGTH) BEGIN -- Hint: The last character is already checked
			-- Stop loop if no white-space
			IF (dbo.IsWhiteSpace(SUBSTRING(@TEXT, @INDEX, 1)) = 0) BREAK;
			-- Otherwise assign index as @SKIPSTART
			SELECT @SKIPSTART = @INDEX;
			-- Increase character index
			SELECT @INDEX = (@INDEX + 1);
		END
		-- Return trimmed string
		RETURN SUBSTRING(@TEXT, @SKIPSTART + 1, @TEXTLENGTH - @SKIPSTART);
	END ELSE BEGIN
		-- RTRIM
		IF (@SKIPEND = 1) BEGIN
			-- Determine end white-space length
			SELECT @INDEX = (@TEXTLENGTH - 1);
			WHILE (@INDEX > 1) BEGIN 
				-- Stop loop if no white-space
				IF (dbo.IsWhiteSpace(SUBSTRING(@TEXT, @INDEX, 1)) = 0) BREAK;
				-- Otherwise increase @SKIPEND
				SELECT @SKIPEND = (@SKIPEND + 1);
				-- Decrease character index
				SELECT @INDEX = (@INDEX - 1);
			END
			-- Return trimmed string
			RETURN SUBSTRING(@TEXT, 1, @TEXTLENGTH - @SKIPEND);
		END 
	END
	-- NO TRIM
	RETURN @TEXT;
END
GO
1 голос
/ 20 августа 2013

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

Однако решение простое:

Определяемая пользователем функция обрезки

0 голосов
/ 24 августа 2014

Эта функция обрезает строку слева и справа. Также он удаляет возврат каретки из строки, действие, которое не выполняется 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 голосов
/ 20 июля 2014

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...