40

私は実際に数週間前にこれを自分で尋ねられましたが、SPまたはUDFでこれを行う方法を正確に知っていますが、これらの方法を使用せずにこれを行う迅速で簡単な方法があるかどうか疑問に思っていました. 私はそこにあると仮定していますが、私はそれを見つけることができません。

ここで注意しなければならない点は、許可されている文字 (az、AZ、0-9) はわかっていますが、許可されていない文字(#@!$ など)を指定したくないということです。また、不正な文字を含む行をプルして、ユーザーが修正できるようにします (入力プロセスを制御できないため、その時点では何もできません)。

私は以前に SO と Google を調べましたが、私が望むものを見つけることができませんでした。英数字が含まれているか含まれていないかを示す多くの例を見てきましたが、クエリ形式で見つけられなかった文でアポストロフィを引き出すことができるもの.

この列の値は、nullまたは''(空) である可能性があることにも注意してください。varchar

4

4 に答える 4

75

これで済まない?

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
于 2009-12-17T06:09:04.453 に答える
10

Sql サーバーの正規表現サポートは非​​常に限られています。このようなものでPATINDEXを使用できます

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

PATINDEX (Transact-SQL)をご覧ください。

および検索条件のパターン マッチング

于 2009-12-17T06:09:33.000 に答える
2

私はこのページを非常にきちんとした解決策で見つけました。それが素晴らしいのは、キャラクターが何であり、どこにいるのかを示すことです. 次に、それを修正するための非常に簡単な方法を提供します (これを組み合わせてドライバー コードに組み込み、アプリケーションをスケールアップすることができます)。

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 の功績によるものです。

于 2016-06-14T12:59:01.607 に答える