SQL Server 2008查询以查找列中包含非字母数字字符的行

时间:2009-12-17 06:00:49

标签: sql sql-server non-alphanumeric

几个星期前我实际上是自己问过这个问题,而我确切知道如何使用SP或UDF进行此操作,但我想知道是否有一种快速简便的方法可以在没有这些方法的情况下执行此操作。我假设有,我找不到它。

我需要说的是,尽管我们知道允许哪些字符(az,AZ,0-9),但我们不想指定不允许的内容(#@!$等等...)。此外,我们想要拉出拥有非法字符的行,以便可以将其列入用户进行修复(因为我们无法控制输入过程,因此我们无法执行任何操作)。

我之前已经浏览过SO和Google,但无法找到符合我想要的任何内容。我已经看到很多例子可以告诉你它是否包含字母数字字符,或者没有,但是能够在查询表单中找不到的句子中提取撇号的东西。

请注意此null列中的值可以为''varchar(空)。

4 个答案:

答案 0 :(得分:58)

不会这样做吗?

SELECT * FROM TABLE
WHERE COLUMN_NAME LIKE '%[^a-zA-Z0-9]%'

<强>设置

use tempdb
create table mytable ( mycol varchar(40) NULL)

insert into mytable VALUES ('abcd')
insert into mytable VALUES ('ABCD')
insert into mytable VALUES ('1234')
insert into mytable VALUES ('efg%^&hji')
insert into mytable VALUES (NULL)
insert into mytable VALUES ('')
insert into mytable VALUES ('apostrophe '' in a sentence') 

SELECT * FROM mytable
WHERE mycol LIKE '%[^a-zA-Z0-9]%'

drop table mytable 

<强>结果

mycol
----------------------------------------
efg%^&hji
apostrophe ' in a sentence

答案 1 :(得分:7)

Sql server对Regex的支持非常有限。你可以使用PATINDEX这样的东西

PATINDEX('%[a-zA-Z0-9]%',Col)

查看PATINDEX (Transact-SQL)

Pattern Matching in Search Conditions

答案 2 :(得分:2)

我找到了this页面,提供了非常简洁的解决方案。它的优点在于你可以看到角色是什么以及角色在哪里。然后它提供了一种非常简单的方法来修复它(它可以组合并构建到一段驱动程序代码中以扩展它的应用程序)。

DECLARE @tablename VARCHAR(1000) ='Schema.Table'
DECLARE @columnname VARCHAR(100)='ColumnName'
DECLARE @counter INT = 0
DECLARE @sql VARCHAR(MAX)

WHILE @counter <=255
BEGIN

SET @sql=

'SELECT TOP 10 '+@columnname+','+CAST(@counter AS VARCHAR(3))+' as CharacterSet, CHARINDEX(CHAR('+CAST(@counter AS VARCHAR(3))+'),'+@columnname+') as LocationOfChar
FROM '+@tablename+'
WHERE CHARINDEX(CHAR('+CAST(@counter AS VARCHAR(3))+'),'+@columnname+') <> 0'

PRINT (@sql)
EXEC (@sql)
SET @counter = @counter + 1
END

然后......

UPDATE Schema.Table
SET ColumnName= REPLACE(Columnname,CHAR(13),'')

感谢Ayman El-Ghazali。

答案 3 :(得分:0)

SELECT * FROM TABLE_NAME WHERE COL_NAME LIKE '%[^0-9a-zA-Z $@$.$-$''''$,]%'

当我试图在字符串中查找任何特殊字符时,这最适合我