40

实际上,几周前我自己也被问过这个问题,而我确切地知道如何使用 SP 或 UDF 来做到这一点,但我想知道如果没有这些方法,是否有一种快速简便的方法来做到这一点。我假设有,但我找不到它。

我需要说明的一点是,尽管我们知道允许使用哪些字符(az、AZ、0-9),但我们不想指定不允许使用的字符(#@!$ 等...)。此外,我们希望拉出包含非法字符的行,以便将其列出给用户进行修复(因为我们无法控制输入过程,此时我们无法做任何事情)。

我以前浏览过 SO 和 Google,但找不到任何我想要的东西。我见过很多例子,它们可以告诉你它是否包含字母数字字符,但是能够在我在查询表单中找不到的句子中提取撇号的东西。

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

4

4 回答 4

75

这不会做吗?

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
于 2009-12-17T06:09:04.453 回答
10

Sql server 对正则表达式的支持非常有限。您可以将 PATINDEX 与这样的东西一起使用

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

看看PATINDEX (Transact-SQL)

搜索条件中的模式匹配

于 2009-12-17T06:09:33.000 回答
2

我发现这个页面有一个非常简洁的解决方案。让它变得很棒的是,你可以知道角色是什么以及它在哪里。然后它提供了一种超级简单的方法来修复它(可以组合并内置到一段驱动程序代码中以扩展它的应用程序)。

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。

于 2016-06-14T12:59:01.607 回答
2
SELECT * FROM TABLE_NAME WHERE COL_NAME LIKE '%[^0-9a-zA-Z $@$.$-$''''$,]%'

当我尝试在字符串中查找任何特殊字符时,这对我最有效

于 2021-02-19T10:05:59.513 回答