Sql 需要更好的解决方案来删除特殊字符和数字

Sql 需要更好的解决方案来删除特殊字符和数字,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,有没有更好的方法来删除一列中的所有特殊字符和数字,而不限于一个或两个,几乎可以删除所有特殊字符和数字。 现在我正在使用这个查询(Jst逻辑部分)。让我知道有没有更好的选择,因为我的表至少包含500万条记录 Declare @name varchar(1000) = '231323Lig%$%$h$%t' Declare @dumy varchar(1000) while(PATINDEX('%[0-9]%',@name)<>0) SET @name = stuff(@n

有没有更好的方法来删除一列中的所有特殊字符和数字,而不限于一个或两个,几乎可以删除所有特殊字符和数字。 现在我正在使用这个查询(Jst逻辑部分)。让我知道有没有更好的选择,因为我的表至少包含500万条记录

Declare @name varchar(1000) = '231323Lig%$%$h$%t'
Declare @dumy varchar(1000)

while(PATINDEX('%[0-9]%',@name)<>0)
    SET @name   = stuff(@name,PATINDEX('%[0-9]%',@name),1,'')


while(PATINDEX('%[A-Z]%',@name)<>0)
begin
    SET @dumy = isnull(@dumy,'')+substring(@name,PATINDEX('%[A-Z]%',@name),1)
    SET @name = stuff(@name,PATINDEX('%[A-Z]%',@name),1,'')
end

Set @name = @dumy

Select @name 'Clean'
Declare@name varchar(1000)='231323Lig%%$%$h$%t'
声明@dumy varchar(1000)
而(PATINDEX('%[0-9]]',@name)0)
设置@name=stuff(@name,PATINDEX('%[0-9]]',@name),1',)
而(PATINDEX('%[A-Z]',@name)0)
开始
SET@dumy=isnull(@dumy,)+子字符串(@name,PATINDEX(“%[A-Z]]”,@name),1)
设置@name=stuff(@name,PATINDEX('%[A-Z]]',@name),1',)
结束
Set@name=@dumy
选择@name“Clean”
尝试此功能:

可以这样称呼:

输出:


更新

如果你想整张桌子都这样做,就这样试试

Select dbo.RemoveNonAlphaCharacters(ColumnName),OtherColumn1,OtherColumn2 
FROM Table1

您可以将函数简化为一个WHILE循环:

DECLARE @String NVARCHAR(MAX) = '231323Lig%$%$h$%t'
DECLARE @Expression NVARCHAR(32) = '%[^A-Z]%'

WHILE PATINDEX(@Expression, @String) > 0
    SET @String = STUFF(@String, PATINDEX(@Expression, @String), 1, '')

RETURN @String
CLR
函数可能比纯T-SQL实现更快

Regex.Replace(str, "[^a-zA-Z]+", "", RegexOptions.Compiled)

谢谢,它是gud,因为它是一个表,我无法将所有记录传递给函数。你能为我提供一个解决方案,立即对整个表执行此操作吗?@user3751754-是的,你可以对整个表执行此操作。请参阅我的最新答案。如果它对你有帮助,请标记答案
Select dbo.RemoveNonAlphaCharacters(ColumnName),OtherColumn1,OtherColumn2 
FROM Table1
DECLARE @String NVARCHAR(MAX) = '231323Lig%$%$h$%t'
DECLARE @Expression NVARCHAR(32) = '%[^A-Z]%'

WHILE PATINDEX(@Expression, @String) > 0
    SET @String = STUFF(@String, PATINDEX(@Expression, @String), 1, '')

RETURN @String
Regex.Replace(str, "[^a-zA-Z]+", "", RegexOptions.Compiled)