Trim space в строке - LTRIM RTRIM не работает

Я пробовал этот код -

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

Тип данных Name varchar(25)

Ни одно из ведущих и конечных пробелов не будет удалено. Когда я копирую-вставляю один такой Name, я получаю это -

"big dash" "space symbol" ABC001

Почему это происходит и как обрезать пробелы?

EDIT -

Вопрос уже ответил. Я нашел еще одну таблицу с этой проблемой. я получил "- value" при копировании столбца строки. Когда я нажимаю клавишу ввода в конце этого скопированного значения, я вижу больше тире. См. Изображение ниже -

Weird symbols

Ответы

Ответ 1

Я подозреваю, некоторые нечитаемые символы (не-ascii) внутри столбца имен, которые могут не удаляться как часть вызовов TRIM.

select convert(varbinary, Name) from table

Чтение вывода HEX из вышеприведенного запроса должно выявить то же самое.

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

Ответ 2

Вы можете сделать что-то грубое, например, удалить первый символ "вручную", если он не является буквенно-цифровым:

update table
    set name = rtrim(ltrim(case when name not like '[a-zA-Z0-9]%'
                                then stuff(name, 1, 1, '')
                                else name
                           end)
                    );

Вы также можете выполнить поиск и замену этого конкретного символа:

update table
    set name = rtrim(ltrim(replace(name, "big dash", '')));

Ответ 3

Если ваша строка содержит некоторые символы, отличные от юникода, то их нужно сначала удалить. Функции для этого даны позже, взятые из этой ссылки - http://iso30-sql.blogspot.com/2010/10/remove-non-printable-unicode-characters.html

Сначала проверьте, есть ли какие-нибудь странные шестнадцатеричные символы, используя <

select convert(varbinary, Name) from table

Затем используйте код, указанный в ссылке выше. Обратите внимание, что при использовании функций квадратные скобки должны быть удалены, иначе код не будет работать. Например. [@DatabaseName = 'MyDatabaseName',] [@SchemaName = 'MySchemaName',]

После этого ваши строки могут иметь некоторые пробелы, которые можно удалить с помощью -

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

Также обратите внимание, что сценарии, указанные в приведенной выше ссылке/ниже, не будут работать с следующая таблица -

CREATE TABLE [dbo].[Junk](
    [JunkHex] nvarchar(50) NULL
) ON [PRIMARY]
GO

GO
INSERT [dbo].[Junk] ([JunkHex]) VALUES (N'Stringğ ')
INSERT [dbo].[Junk] ([JunkHex]) VALUES (N'withħ')
INSERT [dbo].[Junk] ([JunkHex]) VALUES (N'įņvalidđ')
INSERT [dbo].[Junk] ([JunkHex]) VALUES (N'charactersŝ')

Это содержание ссылки, приведенной выше -

Удалить символы без печати /Unicode в SQL Server 2005 Несколько месяцев назад я обновлял некоторые шаблоны отчетов из старой версии Excel (.xls) в Excel 2007 (.xlsx). Я столкнулся с многочисленными проблемами почти сразу, когда попытался создать обновленные отчеты, потому что входящие данные были пронизаны символами, которые не очень хорошо сочетаются с XML. Данные используются для различных целей отчетности, поэтому я решил решить проблему на внутреннем сервере, удалив все, кроме печатных символов ascii.

Я начал с написания простой пользовательской функции для отдельных строк, но я подумал, что мне может понадобиться автоматизировать некоторые из этих задач очистки и в итоге положить что-то вместе, что позволяет немного повысить гибкость. Далее создается основная пользовательская функция строки, а также две процедуры для выполнения очистки на уровне столбцов и таблиц:

Примечание. Каждый из приведенных ниже сценариев использует все те, что над ним. Итак, выполните все скрипты, чтобы получить всю функциональность.

Функция: fn_npclean_string

use [master]
go
set ansi_nulls on
go
set quoted_identifier on
go
CREATE function [dbo].[fn_npclean_string] (
 @strIn as varchar(1000)
)
returns varchar(1000)
as
begin
 declare @iPtr as int
 set @iPtr = patindex('%[^ -~0-9A-Z]%', @strIn COLLATE LATIN1_GENERAL_BIN)
 while @iPtr > 0 begin
  set @strIn = replace(@strIn COLLATE LATIN1_GENERAL_BIN, substring(@strIn, @iPtr, 1), '')
  set @iPtr = patindex('%[^ -~0-9A-Z]%', @strIn COLLATE LATIN1_GENERAL_BIN)
 end
 return @strIn
end

Процедура: sp_npclean_col

use [master]
go
set ansi_nulls on
go
set quoted_identifier on
go
CREATE procedure [dbo].[sp_npclean_col]
 @DatabaseName varchar(75) = null,
 @SchemaName varchar(75) = null,
 @TableName varchar(75),
 @ColumnName varchar(75)
as
begin
 Declare @FullTableName varchar(100)
 declare @UpdateSQL nvarchar(1000)
 if @DatabaseName is null begin
  set @DatabaseName = db_name()
 end
 if @SchemaName is null begin
  set @SchemaName = schema_name()
 end
 set @FullTableName = '[' + @DatabaseName + '].[' + @SchemaName + '].[' + @TableName + ']'
 set @UpdateSQL = 'update ' + @FullTableName + ' set [' + @ColumnName + '] = dbo.fn_npclean_string([' + @ColumnName + ']) where [' + @ColumnName + '] like ''%[^ -~0-9A-Z]%'''
 exec sp_ExecuteSQL @UpdateSQL
end

Процедура: sp_npclean_table

use [master]
go
set ansi_nulls on
go
set quoted_identifier on
go
create procedure [dbo].[sp_npclean_table] 
 @TargetDatabase varchar(75) = null,
 @TargetSchema varchar(75) = null,
 @TargetTable varchar(75)
as
begin
 declare @getColSQL nvarchar(750)
 declare @textCol CURSOR
 declare @curCol varchar(75)
 if @TargetDatabase is null begin
  set @TargetDatabase = db_name()
 end
 if @TargetSchema is null begin
  set @TargetSchema = schema_name()
 end
 set @getColSQL =
  'select sc.name
  from ' + @TargetDatabase + '.sys.columns sc
  join ' + @TargetDatabase + '.sys.types st
  on sc.system_type_id = st.system_type_id
  join ' + @TargetDatabase + '.sys.objects so
  on sc.object_id = so.object_id
  join ' + @TargetDatabase + '.sys.schemas ss
  on so.schema_id = ss.schema_id
  where
  so.type = ''U''
  and st.name in (''text'',''ntext'',''varchar'',''char'',''nvarchar'',''nchar'')
  and sc.is_rowguidcol = 0
  and sc.is_identity = 0
  and sc.is_computed = 0
  and so.name = ''' + @TargetTable + '''
  and ss.name = ''' + @TargetSchema + ''''
 set @getColSQL = 'set @inCursor = cursor for ' + @getColSQL + ' open @incursor'
 execute sp_executesql @getColSQL,N'@inCursor cursor out',@[email protected] OUT
 fetch next from @textCol into @curCol
 while @@fetch_status = 0
 begin
  exec sp_npclean_col @DatabaseName = @TargetDatabase, @SchemaName = @TargetSchema, @TableName = @TargetTable, @ColumnName = @curCol
  fetch next from @textCol into @curCol
 end
 Close @textCol
 DeAllocate @textCol
end

Используя эти, недопустимые символы можно удалить следующими способами:

По строкам:

select master.dbo.fn_npclean_string('Stringğ withħ įņvalidđ charactersŝ')

По столбцу таблицы:

exec master.dbo.sp_npclean_col [@DatabaseName = 'MyDatabaseName',] [@SchemaName = 'MySchemaName',] @TableName = 'MyTableName',  @ColumnName = 'MyColumnName'

В таблице:

exec master.dbo.sp_npclean_table [@TargetDatabase = 'MyDatabaseName',] [@TargetSchema = 'MySchemaName',] @TargetTable = 'MyTableName'

Ответ 4

Частым случаем является то, что перед дополнительной обработкой или отправкой на другой уровень в приложении мы должны удалить ведущие и завершающие пробелы из строки. Мы не можем всегда контролировать, как данные вводятся. Данные могут поступать из другой системы, преобразования данных, старого приложения, EDI, Excel или из приложения, которое плохо контролирует качество. В некоторых из этих случаев пробел может не вводиться или сохраняться в системе как символ 32, который является пробелом, введенным на клавиатуре. Если это происходит, встроенные функции SQL для обрезания пробелов не работают, поэтому становится необходимым заменить "другие" символы пробела символом 32. Затем LTRIM и RTRIM будут работать как ожидалось.

**Select [udfTrim](ColumnName) from Table**

**CREATE FUNCTION [dbo].[udfTrim] 
(
    @StringToClean as varchar(8000)
)**
RETURNS varchar(8000)
AS
BEGIN   
    --Replace all non printing whitespace characers with Characer 32 whitespace
    --NULL
    Set @StringToClean = Replace(@StringToClean,CHAR(0),CHAR(32));
    --Horizontal Tab
    Set @StringToClean = Replace(@StringToClean,CHAR(9),CHAR(32));
    --Line Feed
    Set @StringToClean = Replace(@StringToClean,CHAR(10),CHAR(32));
    --Vertical Tab
    Set @StringToClean = Replace(@StringToClean,CHAR(11),CHAR(32));
    --Form Feed
    Set @StringToClean = Replace(@StringToClean,CHAR(12),CHAR(32));
    --Carriage Return
    Set @StringToClean = Replace(@StringToClean,CHAR(13),CHAR(32));
    --Column Break
    Set @StringToClean = Replace(@StringToClean,CHAR(14),CHAR(32));
    --Non-breaking space
    Set @StringToClean = Replace(@StringToClean,CHAR(160),CHAR(32));

    Set @StringToClean = LTRIM(RTRIM(@StringToClean));
    Return @StringToClean
END

Ответ 5

Пожалуйста, используйте ниже запрос, он удалит пробел новой строки и т.д.

select LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(Name, CHAR(10), CHAR(32)),CHAR(13), CHAR(32)),CHAR(160), CHAR(32)),CHAR(9),CHAR(32))))

Ответ 6

Update TablaName
set Name = CAST(LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(value, CHAR(9), ''), CHAR(13), ''), CHAR(10), ''))) AS VARCHAR(50))