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
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
Комментарии
Отправить комментарий