вторник, 7 января 2014 г.

Замена текста по всей базе MSSQL


Иногда бывает, один и тот же текст раскидан по разным таблицам и необходимо его быстро заменить другим текстом. Пришлось написать универсальный скрипт, работающий для любой базы для любой последовательности символов.
Предположим, есть база test. Скрипт замены следующий:

USE test 

DECLARE @EXIST_TEXT NVARCHAR(100) = 'текст существующий' --ТО, ЧТО ЕСТЬ И НАДО ЗАМЕНИТЬ, Т.Е. ЗАМЕНЯЕМЫЙ ТЕКСТ
DECLARE @NEW_TEXT NVARCHAR(100) = 'текст новый' --ТО, ЧЕМ НАДО ЗАМЕНИТЬ, Т.Е. ЗАМЕНЯЮЩИЙ ТЕКСТ ИЛИ НОВЫЙ ТЕКСТ
DECLARE @DINAMIC_SQL NVARCHAR(MAX) = ''

--Проверка на существование таблицы SEARCH_TABLES
   IF EXISTS(SELECT  [TABLE_NAME] FROM [INFORMATION_SCHEMA].[TABLES]    WHERE TABLE_NAME ='SEARCH_TABLES' ) 
BEGIN
DROP TABLE SEARCH_TABLES 
END

--ВЫБИРАЕМ ВСЕ ТЕКСТОВЫЕ СТОЛБЦЫ
select distinct ID = IDENTITY(INT, 1, 1), c.TABLE_NAME, C.COLUMN_NAME, C.DATA_TYPE
INTO SEARCH_TABLES
from INFORMATION_SCHEMA.[COLUMNS] c
where c.DATA_TYPE  in('char', 'varchar', 'nchar', 'text', 'ntext', 'nvarchar') AND C.COLUMN_NAME != '_Number'
ORDER BY C.TABLE_NAME

--ЦИКЛ ПО ТАБЛИЦЕ СО СТОЛБЦАМИ
DECLARE @I INT = 1
DECLARE @MAX_ID INT = (SELECT MAX(ID) FROM SEARCH_TABLES)
DECLARE @CURRENT_TABLE_NAME NVARCHAR(128) 
DECLARE @CURRENT_COLUMN_NAME NVARCHAR(128) 
WHILE @I<= @MAX_ID
BEGIN 
--ПОЛУЧАЕМ ИМЯ ТАБЛИЦЫ
SET @CURRENT_TABLE_NAME = (SELECT TABLE_NAME FROM SEARCH_TABLES WHERE ID = @I)
--ПОЛУЧАЕМ ИМЯ СТОЛБЦА
SET @CURRENT_COLUMN_NAME  = (SELECT COLUMN_NAME FROM SEARCH_TABLES WHERE ID = @I)
--СОСТАВЛЯЕМ КОМАНДУ ЗАМЕНЫ
SET @DINAMIC_SQL = ' UPDATE ' + @CURRENT_TABLE_NAME + ' SET ' + @CURRENT_COLUMN_NAME + '  = REPLACE( CAST(' + @CURRENT_COLUMN_NAME + ' AS NVARCHAR(MAX)) , ''' + @EXIST_TEXT + ''', ''' + @NEW_TEXT + ''') WHERE ' + @CURRENT_COLUMN_NAME + ' LIKE ''%' + @EXIST_TEXT + '%'''
--ПУСК
EXECUTE(@DINAMIC_SQL) 
SET @I = @I + 1
END 

--Проверка на существование таблицы SEARCH_TABLES
   IF EXISTS(SELECT  [TABLE_NAME] FROM [INFORMATION_SCHEMA].[TABLES] WHERE TABLE_NAME ='SEARCH_TABLES' ) 
BEGIN
DROP TABLE SEARCH_TABLES 
END



Комментариев нет:

Отправить комментарий