2009-12-17 20 views
22

Tôi đã tự hỏi bản thân mình cách đây vài tuần, trong khi tôi biết chính xác cách thực hiện điều này với SP hoặc UDF nhưng tôi đã tự hỏi nếu có cách nhanh chóng và dễ dàng để làm điều này mà không có những phương pháp này. Tôi giả định rằng có và tôi chỉ không thể tìm thấy nó.Truy vấn SQL Server 2008 để tìm các hàng chứa các ký tự không phải chữ và số trong một cột

Điểm tôi cần thực hiện là mặc dù chúng tôi biết ký tự nào được phép (az, AZ, 0-9) chúng tôi không muốn chỉ định những gì không được phép (# @! $ V.v ...). Ngoài ra, chúng tôi muốn kéo các hàng mà các ký tự không hợp lệ để nó có thể được liệt kê cho người dùng sửa (vì chúng tôi không kiểm soát quá trình nhập mà chúng tôi không thể thực hiện bất kỳ điều gì tại thời điểm đó).

Tôi đã xem xét thông qua SO và Google trước đó, nhưng không thể tìm thấy bất cứ điều gì đã làm những gì tôi muốn. Tôi đã thấy nhiều ví dụ mà có thể cho bạn biết nếu nó có chứa các ký tự chữ và số, hay không, nhưng cái gì đó có thể kéo ra một dấu nháy đơn trong một câu tôi đã không tìm thấy trong biểu mẫu truy vấn.

Cũng xin lưu ý rằng các giá trị có thể là null hoặc '' (trống) trong cột varchar này.

+2

Phiên bản SQL Server nào? Điều này nghe giống như một công việc regex –

+0

@OMG Ngựa con Tôi đã cập nhật chủ đề, nó là một "Tôi tự hỏi làm thế nào bạn có thể làm điều này" hơn là cần thiết cho một hệ thống cụ thể, nhưng đơn giản vì lợi ích cho phép chỉ nói nó là 2008. – Jay

Trả lời

46

Sẽ không làm điều đó?

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

Cài đặt

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 

Kết quả

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

LIKE doesn ' t hỗ trợ regexes, chỉ có ký tự đại diện. Và chúng tôi không biết phiên bản hiện tại là gì .. –

+0

Chúng tôi không cần RegEx để giải quyết vấn đề này. Trừ khi tôi đang thiếu cái gì đó. – beach

+0

Hãy để tôi nói lại - chúng tôi không cần hỗ trợ đầy đủ RegEx. Sử dụng mẫu đơn giản khớp với các hỗ trợ LIKE (hoặc PATINDEX) là đủ. Chúng tôi chỉ cần tìm một ký tự đơn không có trong danh sách được phép. – beach

6

Sql server có hỗ trợ Regex rất hạn chế. Bạn có thể sử dụng PATINDEX với một cái gì đó như thế này

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

Có một cái nhìn tại PATINDEX (Transact-SQL)

Pattern Matching in Search Conditions

+3

Nếu bạn muốn sử dụng PATINDEX, bạn cần phải làm một cái gì đó như thế này: "SELECT * TỪ mytable WHERE PATINDEX ('% [^ a-zA-Z0-9]%', mycol)> 1" – beach

+1

Vâng, đây là chính xác. Chọn nó trong danh sách cột sẽ chỉ hiển thị cho bạn các giá trị. –

+0

Đây là cách tôi sử dụng nó để xóa các hàng có caracters không phải là tiếng Latin trong một cột cụ thể: xóa FROM [DefaultConnection]. [Dbo]. [AspNetUsers] trong đó PATINDEX ('% [a-zA-Z0-9]%', quốc gia) = 0 –

2

tôi thấy this trang với một giải pháp khá gọn gàng. Điều gì làm cho nó tuyệt vời là bạn nhận được một dấu hiệu của nhân vật là gì và nó ở đâu. Sau đó, nó cung cấp cho một cách siêu đơn giản để sửa chữa nó (có thể được kết hợp và xây dựng thành một đoạn mã trình điều khiển để mở rộng quy mô ứng dụng của nó).

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 

và sau đó ...

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

tín dụng để Ayman El-Ghazali.

Các vấn đề liên quan