Подтвердить что ты не робот

Запрос SQL Server 2008 для поиска строк, содержащих не алфавитно-цифровые символы в столбце

На самом деле меня спросили это несколько недель назад, тогда как я точно знаю, как это сделать с помощью SP или UDF, но мне было интересно, есть ли быстрый и простой способ сделать это без этих методов. Я предполагаю, что есть, и я просто не могу его найти.

То, что мне нужно сделать, состоит в том, что, хотя мы знаем, какие символы разрешены (a-z, A-Z, 0-9), мы не хотим указывать, что не разрешено (# @! $и т.д.). Кроме того, мы хотим вывести строки, в которых есть нелегальные символы, чтобы он мог быть указан пользователю для исправления (поскольку у нас нет контроля над процессом ввода, мы ничего не можем сделать в этой точке).

Я раньше просматривал SO и Google, но не смог найти ничего, что делало то, что я хотел. Я видел много примеров, которые могут сказать вам, содержит ли он буквенно-цифровые символы или нет, но что-то, что может вытащить апостроф в предложении, которое я не нашел в форме запроса.

Обратите внимание, что в этом столбце varchar значения могут быть null или '' (empty).

4b9b3361

Ответ 1

Разве это не будет?

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

Ответ 3

Я нашел эту страницу с довольно аккуратным решением. Что отличает вас от того, что вы получаете представление о том, что такое персонаж и где он находится. Затем он дает супер простой способ его исправить (который может быть объединен и встроен в кусок кода драйвера для расширения его приложения).

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

Кредит Айман Эль-Газали.