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

问题描述:

几周前我实际上被问到这一点,但我确切知道如何使用SP或UDF执行此操作,但我想知道是否有无需这些方法即可快速简单地完成此操作。我假设有,我无法找到它。SQL Server 2008查询查找列中包含非字母数字字符的行

我需要做的一点是,虽然我们知道哪些字符是允许的(az,AZ,0-9),我们不想指定什么是不允许的(#@!$ etc ... )。另外,我们想拉动那些有非法字符的行,这样它就可以列出给用户来修复(因为我们无法控制输入过程,所以我们在这一点上什么都不能做)。

我曾浏览过SO和Google,但无法找到任何我想做的事情。我看过很多例子,它们可以告诉你它是否包含字母数字字符,或者不能,但是能够在我没有在查询表格中找到的句子中提取撇号的东西。

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

+2

什么版本的SQL Server?这听起来像一个正则表达式的工作 – 2009-12-17 06:04:59

+0

@OMG小马我已经更新了这个主题,它更多的是“我想你可以做到这一点”,而不是一个特定的系统需要,但简单的缘故让我们只说它是2008年。 – Jay 2009-12-17 06:22:07

不是这样做吗?

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 
+0

LIKE doesn'不支持正则表达式,只支持通配符。我们不知道目前的版本是什么.. – 2009-12-17 06:09:52

+0

我们不需要RegEx来解决这个问题。除非我错过了一些东西。 – beach 2009-12-17 06:12:36

+0

让我换个口音 - 我们不需要完整的RegEx支持。使用LIKE支持的简单模式匹配(或PATINDEX)就足够了。我们只需要找到一个不在允许列表中的单个字符。 – beach 2009-12-17 06:17:57

SQL Server有非常有限的正则表达式的支持。您可以使用PATINDEX像这样的东西

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

看一看PATINDEX (Transact-SQL)

Pattern Matching in Search Conditions

+3

如果你想使用PATINDEX,你需要这样做: “SELECT * FROM mytable WHERE PATINDEX('%[^ a-zA-Z0-9]%',mycol)> 1” – beach 2009-12-17 06:19:33

+1

是的,这是正确。在列列表中选择它只会显示值在哪里。 – 2009-12-17 06:23:43

+0

这是我如何使用它删除特定列中的非拉丁字符的行: delete FROM [DefaultConnection]。[dbo]。[AspNetUsers]其中PATINDEX('%[a-zA-Z0-9]%',国家)= 0 – 2016-07-22 18:05:00

我发现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 '[email protected]+','+CAST(@counter AS VARCHAR(3))+' as CharacterSet, CHARINDEX(CHAR('+CAST(@counter AS VARCHAR(3))+'),'[email protected]+') as LocationOfChar 
FROM '[email protected]+' 
WHERE CHARINDEX(CHAR('+CAST(@counter AS VARCHAR(3))+'),'[email protected]+') <> 0' 

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

然后......

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

感谢艾曼·加扎利。