Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 修剪字符串中的空格-LTRIM RTRIM不工作_Sql_Sql Server - Fatal编程技术网

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”代码块,它们仍然包含括号。您在帖子中提到要删除这些,但您将它们保留在提供的代码中。肌萎缩侧索硬化