Запрос SQL Server 2008 для поиска строк, содержащих не алфавитно-цифровые символы в столбце
На самом деле меня спросили это несколько недель назад, тогда как я точно знаю, как это сделать с помощью SP или UDF, но мне было интересно, есть ли быстрый и простой способ сделать это без этих методов. Я предполагаю, что есть, и я просто не могу его найти.
То, что мне нужно сделать, состоит в том, что, хотя мы знаем, какие символы разрешены (a-z, A-Z, 0-9), мы не хотим указывать, что не разрешено (# @! $и т.д.). Кроме того, мы хотим вывести строки, в которых есть нелегальные символы, чтобы он мог быть указан пользователю для исправления (поскольку у нас нет контроля над процессом ввода, мы ничего не можем сделать в этой точке).
Я раньше просматривал SO и Google, но не смог найти ничего, что делало то, что я хотел. Я видел много примеров, которые могут сказать вам, содержит ли он буквенно-цифровые символы или нет, но что-то, что может вытащить апостроф в предложении, которое я не нашел в форме запроса.
Обратите внимание, что в этом столбце varchar
значения могут быть null
или ''
(empty).
Ответы
Ответ 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
Ответ 2
Sql-сервер имеет очень ограниченную поддержку Regex. Вы можете использовать PATINDEX с чем-то вроде этого
PATINDEX('%[a-zA-Z0-9]%',Col)
Посмотрите PATINDEX (Transact-SQL)
и Соответствие шаблону в условиях поиска
Ответ 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),'')
Кредит Айман Эль-Газали.