2009-12-17 4 views
22

Ich wurde eigentlich selbst gefragt, vor ein paar Wochen, während ich genau weiß, wie dies mit einem SP oder UDF tun, aber ich frage mich, ob es ein schnelle und einfache Möglichkeit, dies ohne diese Methoden zu tun. Ich nehme an, dass es da ist und ich kann es einfach nicht finden.SQL Server 2008 Abfrage, um Zeilen mit nicht-alphanumerischen Zeichen in einer Spalte zu finden

Ein Punkt, den ich machen muss ist, dass, obwohl wir wissen, welche Zeichen erlaubt sind (az, AZ, 0-9) wir nicht angeben wollen, was nicht erlaubt ist (# @! $ Etc ...). Außerdem möchten wir die Zeilen, die haben, die unzulässigen Zeichen ziehen, damit sie dem Benutzer zur Korrektur aufgelistet werden können (da wir keine Kontrolle über den Eingabeprozess haben, können wir zu diesem Zeitpunkt nichts tun).

Ich habe SO und Google vorher durchgeschaut, aber konnte nichts finden, was tat, was ich wollte. Ich habe viele Beispiele gesehen, die Ihnen sagen können, ob sie alphanumerische Zeichen enthalten oder nicht, aber etwas, das in der Lage ist, einen Apostroph in einem Satz zu ziehen, den ich in der Abfrageform nicht gefunden habe.

Bitte beachten Sie auch, dass in dieser varchar Spalte Werte null oder '' (leer) sein können.

+2

Welche Version von SQL Server? Das klingt wie ein Regex-Job –

+0

@OMG Ponys Ich habe das Thema aktualisiert, es ist eher ein "Ich frage mich, wie Sie das tun könnten" anstatt für ein bestimmtes System benötigt, aber Simplicities willen lassen Sie einfach sagen, es ist 2008. – Jay

Antwort

46

Wird dies nicht tun?

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

Setup-

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 

Ergebnisse

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

LIKE doesn ' t Unterstützung regexes, nur der Platzhalter. Und wir wissen derzeit nicht welche Version. –

+0

Wir brauchen keine RegEx, um dieses Problem zu lösen. Es sei denn, ich vermisse etwas. – beach

+0

Lassen Sie mich umformulieren - wir brauchen keine volle RegEx-Unterstützung. Die Verwendung des einfachen Mustervergleichs, das LIKE unterstützt (oder PATINDEX), sollte ausreichen. Wir müssen nur ein einzelnes Zeichen finden, das nicht in der erlaubten Liste ist. – beach

6

SQLServer sehr begrenzte Regex Unterstützung hat. Sie können PATINDEX mit so etwas wie diese

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

Werfen Sie einen Blick auf PATINDEX (Transact-SQL)

und Pattern Matching in Search Conditions

+3

Wenn Sie PATINDEX verwenden möchten, müssen Sie Folgendes tun: "SELECT * FROM meine Tabelle WHERE PATINDEX ('% [^ a-ZA-Z0-9]%', Mycol)> 1" – beach

+1

Ja, das ist richtig. Wenn Sie es in der Spaltenliste auswählen, sehen Sie nur, wo die Werte sind. –

+0

So habe ich Zeilen mit nicht lateinischen Zeichen in einer bestimmten Spalte gelöscht: löschen FROM [DefaultConnection]. [Dbo]. [AspNetUsers] wo PATINDEX ('% [a-zA-Z0-9]%', Land) = 0 –

2

Ich fand this Seite mit ziemlich sauberen Lösung verwenden. Was macht es großartig, dass Sie einen Hinweis bekommen, was der Charakter ist und wo es ist. Dann gibt es eine sehr einfache Möglichkeit, es zu reparieren (die kombiniert und in einen Teil des Treibercodes eingebaut werden kann, um seine Anwendung zu vergrößern).

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 

und dann ...

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

Credit Ayman El-Ghazali.