SQL SERVER. Поиск символа CHAR(39) во всех таблицах.

           При создании отчетов в программном обеспечении возникла проблема с символом CHAR(39) в тексте. Возникла задача найти все таблицы и колонки, которые  содержат этот символ. Скрипт поиска по всем таблицам был найден очень давно. Но его пришлось чуть доработать: добавить информацию по схемам и задать поиск именно одного апострофа в поле.

SET NOCOUNT ON
DECLARE @name VARCHAR(128), @column VARCHAR(128), @schema  VARCHAR(128), @sql VARCHAR(MAX)

CREATE TABLE #rslt
(table_name VARCHAR(128), field_name VARCHAR(128), value NTEXT)

DECLARE s CURSOR FAST_FORWARD FOR
SELECT table_schema, table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE'
OPEN s
FETCH NEXT FROM s INTO @schema, @name
WHILE @@fetch_status = 0
BEGIN
 DECLARE c CURSOR FAST_FORWARD FOR
SELECT quotename(column_name) AS column_name FROM information_schema.columns
 WHERE data_type IN ('TEXT', 'NTEXT', 'VARCHAR', 'CHAR', 'NVARCHAR', 'CHAR', 'SYSNAME') AND table_name  = @name AND table_schema = @schema
 SET @name = quotename(@name)
 OPEN c
 FETCH NEXT FROM c INTO @column
 WHILE @@fetch_status = 0
 BEGIN
   SET @sql = 'INSERT INTO #rslt 
                            SELECT ''' + @schema + '.' + @name + ''' AS Table_name, ''' +                                                                            @column + ''', ' + @column + '
                                 FROM ' + @schema + '.' + @name + ' WHERE ' + @column + ' LIKE ''%''''%''                                             AND ' + @column + ' NOT LIKE ''%''''''''%'''
   EXEC(@sql);
   FETCH NEXT FROM c INTO @column
 END
 CLOSE c
 DEALLOCATE c
 FETCH NEXT FROM s INTO @schema, @name
END
--Если нужно, можем отобразить все найденные значения
SELECT * FROM #rslt ORDER BY table_name, field_name
DROP TABLE #rslt
CLOSE s
DEALLOCATE s

Комментарии

Популярные сообщения из этого блога

SQL SERVER. Автономные транзакции. Autonomous transaction.

ORA-04043: object SYS_PLSQL_XXXXXXXX_XXX_X does not exist

SQL SERVER Broker Priority