MS SQL Server — замена значения поля (ID) по всей БД

На базе запроса по поиску GUID по всем таблицам БД можно написать запрос замены одного значения поля на другое:

Параметры:

@substr — значение исходного (найденного) параметра;

@substrnew — значение нового параметра;

@columnName — наименование поля, значение которого необходимо поменять.

Код скрипта:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
SET nocount ON
DECLARE @name VARCHAR(128), @substr VARCHAR(128), @COLUMN VARCHAR(128), @substrnew VARCHAR(128), @columnName VARCHAR(128)
SET @substr = 'DA32112F-0132-45F1-8D09-AE2E53B6A38D' --введите значение исходного параметра 
SET @substrnew = 'F1362CE3-AC66-458D-B709-0A1EFD7C0CDE' --введите значение нового параметра 
SET @columnName = 'OrganizationID' --наименование поля, значение которого необходимо поменять
 
CREATE TABLE #rslt 
(TABLE_NAME VARCHAR(128), field_name VARCHAR(128), VALUE uniqueidentifier)
DECLARE s cursor FOR SELECT '['+TABLE_SCHEMA+'].['+ TABLE_NAME+']' AS TABLE_NAME FROM information_schema.tables WHERE table_type = 'BASE TABLE'
AND LEFT(TABLE_NAME,8)<>'MSmerge_' --and TABLE_NAME='DocumentTypeExpressions'
ORDER BY TABLE_NAME
 
OPEN s
fetch NEXT FROM s INTO @name
while @@fetch_status = 0
BEGIN
DECLARE c cursor FOR 
SELECT column_name AS column_name FROM information_schema.columns 
--where data_type in ('text', 'ntext', 'varchar', 'char', 'nvarchar', 'char', 'sysname') and table_name = @name
WHERE data_type IN ('uniqueidentifier') AND '['+TABLE_SCHEMA+'].['+TABLE_NAME+']' = @name
-- set @name = @name
OPEN c
fetch NEXT FROM c INTO @COLUMN
while @@fetch_status = 0
BEGIN
print 'Processing table - ' + @name + ', column - ' + @COLUMN
EXEC('insert into #rslt select ''' + @name + ''' as Table_name, ''' + @COLUMN + ''', ' + @COLUMN + 
' from ' + @name + ' WITH (NOLOCK) where ' + @COLUMN + ' = ''' + @substr + '''')
fetch NEXT FROM c INTO @COLUMN
END
close c
deallocate c
fetch NEXT FROM s INTO @name
END
SELECT 'update'+ ' ' + TABLE_NAME+ ' ' +'set'+' '+ @columnName +'='+ ' '+ ''''+@substr+'''' +' '+'where'+ ' ' +@columnName+ '='+ ''''+@substrnew+'''' AS "Скрипт для замены"
FROM #rslt
GROUP BY TABLE_NAME, field_name
ORDER BY TABLE_NAME, field_name
DROP TABLE #rslt
close s
deallocate s

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *