2009-12-17 171 views
22

幾周前我實際上被問到這一點,但我確切知道如何使用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

回答

46

不是這樣做嗎?

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

6

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

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 '[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),'') 

感謝艾曼·加扎利。

相關問題