Sql 修剪字符串中的空格-LTRIM RTRIM不工作
我试过这个密码-Sql 修剪字符串中的空格-LTRIM RTRIM不工作,sql,sql-server,Sql,Sql Server,我试过这个密码- UPDATE Table SET Name = RTRIM(LTRIM(Name)) 名称的数据类型是varchar(25) 不会删除任何前导空格和尾随空格。当我复制粘贴一个这样的名称, 我明白了- "big dash" "space symbol" ABC001 为什么会发生这种情况?如何修剪空间 编辑- CREATE TABLE [dbo].[Junk]( [JunkHex] nvarchar(50) NULL ) ON [PRIMARY] GO GO INS
UPDATE Table
SET Name = RTRIM(LTRIM(Name))
名称的数据类型是varchar(25)
不会删除任何前导空格和尾随空格。当我复制粘贴一个这样的名称
,
我明白了-
"big dash" "space symbol" ABC001
为什么会发生这种情况?如何修剪空间
编辑-
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ŝ')
这个问题已经回答了。我又找到一张有这个问题的桌子。我明白了
复制行中的列时使用“-value”。当我在复制粘贴值的末尾按enter键时,我会看到更多的破折号。见下图-
您可以使用暴力,例如,如果第一个字符不是字母数字,则“手动”删除它:
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", '')));
select ascii(substring(' Your string with leading invisible character',1,1));
-- returns something like 160
我怀疑,name列中的一些不可读(非ascii字符)可能不会作为
TRIM
调用的一部分被删除
select convert(varbinary, Name) from table
读取上述查询的HEX
输出应该会显示相同的结果
请阅读了解如何编写函数来删除这些字符。如果您的字符串有一些非unicode字符,则需要先删除这些字符。这些功能将在后面给出,取自此链接- 首先,检查是否有任何奇怪的十六进制字符使用-
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ŝ')
这是我上面给出的链接的内容-
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ŝ')
删除SQL Server 2005中不可打印的/Unicode字符
几个月前,我正在将一些报表模板从旧版本的Excel(.xls)升级到Excel 2007(.xlsx)。当我试图生成升级后的报告时,几乎立即遇到了许多问题,因为传入的数据充满了与XML不兼容的字符。数据用于各种报告目的,因此我决定在后端解决这个问题,除去可打印的ascii字符以外的所有字符
我从为单个字符串编写一个简单的用户函数开始,但我开始思考,我可能想自动化一些清理任务,最后把一些东西放在一起,允许更大的灵活性。下面创建基本字符串用户函数,以及在列和表级别执行清理的两个过程:
注意-下面的每个脚本都使用上面的所有脚本。因此,执行所有脚本以获得所有功能
功能:fn\u npclean\u字符串
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_表
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',@inCursor=@textCol 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'
在进行额外处理或将字符串发送到应用程序中的另一层之前,我们必须删除字符串的前导空格和尾随空格,这是一种常见的情况。我们不能总是控制数据的输入方式。数据可能来自另一个系统、数据转换、旧应用程序、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
有些情况下,LTRIM RTRIM没有做你想做的事情,对我来说,这是因为tab键插入数据库时,我们无法从眼睛中看到它。在这种情况下,修剪功能不起作用 尝试此代码
更新
将NAME=CAST(LTRIM(RTRIM(REPLACE(REPLACE)(REPLACE)(value,CHAR(9),“”),CHAR(13),“”),CHAR(10),“”))设置为VARCHAR(50))
请使用下面的查询,它将删除空格新行等
select LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(Name, CHAR(10), CHAR(32)),CHAR(13), CHAR(32)),CHAR(160), CHAR(32)),CHAR(9),CHAR(32))))
您可以使用上面的十六进制方法,也可以使用ASCII()函数确定相关字符的ASCII码
SELECT ASCII(SUBSTRING(' character string', 1, 1))
SELECT ASCII(SUBSTRING(' character string', 2, 1))
select仅为指定的字符返回1个值。但它有助于确定需要替换的ASCII CHAR()值
-Eric Isaacs用这个来识别冒犯的角色:
update table
set name = rtrim(ltrim(replace(name, "big dash", '')));
select ascii(substring(' Your string with leading invisible character',1,1));
-- returns something like 160
使用此选项替换冒犯的角色
replace(' Your string with leading invisible character', char(160),'')
名称列的数据类型?我猜这可能是字符的意思,它的长度是固定的。因此,除了输入文本之外的其他文本都用空格填充??!!仅供参考。。我没有投反对票!这个-1用于什么?@OracleUser-名称的数据类型是varchar(25)
从表中选择convert(varbinary,Name)。。请参见其中的十六进制值。。可能是一些不可读的spl字符。所以,正如我所猜测的,您的内部有垃圾。。您可能需要编写一些函数来删除它们。。请参阅。删除所有这些字符。谢谢戈登。有没有一种方法可以复制这个十六进制问题,以便我也可以尝试您的解决方案?第二种方法有效,但在我们不知道违规符号是什么的情况下不起作用。我收到一个错误-消息102,级别15,状态1,第5行“')附近的语法不正确。删除后,它工作了。顺便说一句,这里给出的表的第一个脚本失败了-顺便说一句,当我们用这里给出的代码创建一个表时,这个脚本失败了-@InTheSKies+1在提供的链接和描述上-它对我来说工作得很好。但是,需要编辑的一件事是末尾的“By table column”和“By table”代码块,它们仍然包含括号。您在帖子中提到要删除这些,但您将它们保留在提供的代码中。肌萎缩侧索硬化