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

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

Я должен подчеркнуть, что хотя мы знаем, какие символы разрешены (az, AZ, 0-9), мы не хотим указывать, что не разрешено (# @! $ И т. Д.) ...). Кроме того, мы хотим извлечь строки, которые имеют недопустимых символов, чтобы их можно было внести в список для исправления пользователем (поскольку у нас нет контроля над процессом ввода, мы ничего не можем сделать в этот момент) ,

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

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

Ответы [ 3 ]

59 голосов
/ 17 декабря 2009

Разве это не делает это?

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
7 голосов
/ 17 декабря 2009

Sql сервер имеет очень ограниченную поддержку Regex. Вы можете использовать PATINDEX с чем-то вроде этого

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

Посмотрите на PATINDEX (Transact-SQL)

и Сопоставление с образцом в условиях поиска

2 голосов
/ 14 июня 2016

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

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

Благодарность Айману Эль-Газали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...