Friday, December 30, 2011

Быстрая синхронизация УникальныйИдентификаторов 1С с помощью скрипта MS SQL

Столкнулся с одной проблемой, если две базы перекачавшиеся с 7 в 8 УТ, фактически наименование справочников совпадает, даже часть кодов одинакова, а вот гуиды разные. Для этого был реализован следующий скрипт:
if OBJECT_id('temp.dbo.#TTable') is not null
drop table dbo.#TTable;
go
 
use RL_Retail;
SET NOCOUNT ON
DECLARE @tablename sysname;
DECLARE @columnname sysname;
declare @SRef binary(16);
declare @TRef binary(16);
declare @inSRef binary(16);
declare @inTRef binary(16);
declare @sql nvarchar(max);
declare @sSRef nvarchar(34);
declare @sTRef nvarchar(34);
 
 
SELECT  Target._IDRRef as [T_IDRRef]
,Source._IDRRef as [S_IDRRef]
into dbo.#TTable    
FROM RL_Retail.dbo._Reference56 AS Target
join rl_distrib.dbo._Reference56 as Source ON Source._Description = Target._Description
where (not Target._IDRRef is null) and (not Target._IDRRef=Source._IDRRef)
 
 
DECLARE cur_name CURSOR SCROLL FOR
SELECT table_name=sysobjects.name,
column_name=syscolumns.name
--datatype=systypes.name,
--length=syscolumns.length
FROM sysobjects
JOIN syscolumns ON sysobjects.id = syscolumns.id
JOIN systypes ON syscolumns.xtype=systypes.xtype
WHERE sysobjects.xtype='U' and systypes.name='binary' and syscolumns.length=16 and Right(syscolumns.name,3)='Ref'
ORDER BY sysobjects.name,syscolumns.colid
OPEN cur_name
FETCH NEXT FROM cur_name INTO @tablename, @columnname
while @@FETCH_STATUS = 0
BEGIN
set @sSRef = Convert(nvarchar(34),CONVERT(char(34),@SRef,1));
set @sTRef = Convert(nvarchar(34),CONVERT(char(34),@TRef,1));
set @sql = N'update updateTarget set ' + @columnname + N'= tablesource.S_IDRRef 
From 
RL_Retail.dbo.'+@tablename+N' AS updateTarget
Join 
dbo.#TTable as tablesource
on updateTarget.' + @columnname + N' = tablesource.T_IDRRef';
--set @sql = 'select @TRef'
-- EXEC (@sql )
EXEC sp_executesql @stmt = @sql;
 
FETCH NEXT FROM cur_name INTO @tablename, @columnname
END
CLOSE cur_name
DEALLOCATE cur_name
drop table dbo.#TTable;
в принципе мне повезло с тем, что таблицы _Reference56 были одинаковые, поэтому делаем выборку с соединением по наименованию, а дальше уже скулом обходим все таблицы базы и обновляем GUID

No comments:

Post a Comment