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))