Иногда бывает, один и тот же текст раскидан по разным таблицам и необходимо его быстро заменить другим текстом. Пришлось написать универсальный скрипт, работающий для любой базы для любой последовательности символов.
Предположим, есть база 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
Комментариев нет:
Отправить комментарий