我需要说的是,尽管我们知道允许哪些字符(az,AZ,0-9),但我们不想指定不允许的内容(#@!$等等...)。此外,我们想要拉出拥有非法字符的行,以便可以将其列入用户进行修复(因为我们无法控制输入过程,因此我们无法执行任何操作)。
我之前已经浏览过SO和Google,但无法找到符合我想要的任何内容。我已经看到很多例子可以告诉你它是否包含字母数字字符,或者没有,但是能够在查询表单中找不到的句子中提取撇号的东西。
请注意此null
列中的值可以为''
或varchar
(空)。
答案 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)
答案 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 $@$.$-$''''$,]%'
当我试图在字符串中查找任何特殊字符时,这最适合我