DROP PROCEDURE IF EXISTS dev.uspCloneIntezmenyCreateMapping GO CREATE PROCEDURE dev.uspCloneIntezmenyCreateMapping @pSourceIntezmenyId int ,@pSourceDatabase nvarchar(60) ,@pDebugMode bit = 0 AS BEGIN DECLARE @sql nvarchar(max) ,@maxId int ,@tableName nvarchar(100) ,@mainTableName nvarchar(50) ,@isIdentity bit ,@message nvarchar(max) ,@rowCount int -- ============================================================== -- -- Mapping tábla létrehozása -- -- ============================================================== -- DROP TABLE IF EXISTS MappingTable CREATE TABLE MappingTable ( tableName nvarchar(50), oldId int, newId int ) SET @message = 'POPULATE MAPPINGTABLE... - ' + FORMAT(GETDATE(), 'hh:mm:ss.ff') RAISERROR (@message, 10, 1) WITH NOWAIT -- ============================================================== -- -- Mapping tábla feltöltése: Intezmeny -- -- ============================================================== -- SELECT @maxId = ISNULL(MAX(ID), 0) FROM T_INTEZMENY; SET @sql = ' INSERT INTO MappingTable (tableName, oldId, [newId]) SELECT ''T_INTEZMENY'', ID, @maxId + 1 FROM ' + @pSourceDatabase + '.dbo.T_INTEZMENY WHERE ID = @pSourceIntezmenyId SET @rowCount = @@ROWCOUNT ' IF @pDebugMode = 1 RAISERROR (@sql, 10, 1) WITH NOWAIT EXEC sp_executesql @sql, N'@pSourceIntezmenyId int, @maxId int, @rowCount int output', @pSourceIntezmenyId, @maxId, @rowCount output SET @message = ' MP ' + FORMAT(GETDATE(), 'HH:mm:ss.ff') + ' T_INTEZMENY - ' + CAST(@rowCount AS nvarchar(20)) + ' sor' RAISERROR (@message, 10, 1) WITH NOWAIT -- ============================================================== -- -- Mapping tábla feltöltése: IDENTITY() táblákból -- -- ============================================================== -- DECLARE tbl_cur CURSOR LOCAL FOR SELECT DISTINCT TABLE_NAME, COLUMNPROPERTY(OBJECT_ID(TABLE_NAME), 'ID', 'IsIdentity') FROM INFORMATION_SCHEMA.COLUMNS c WHERE COLUMN_NAME = N'C_INTEZMENYID' AND TABLE_NAME IN (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA = 'dbo') AND c.TABLE_SCHEMA = 'dbo' AND TABLE_NAME NOT IN (N'T_ENTITYATTRIBUTEHISTORY', N'T_DICTIONARYTYPE') AND COLUMNPROPERTY(OBJECT_ID(TABLE_NAME), 'ID', 'IsIdentity') = 1 ORDER BY TABLE_NAME OPEN tbl_cur FETCH NEXT FROM tbl_cur INTO @tableName, @isIdentity WHILE @@FETCH_STATUS = 0 BEGIN SET @sql = N' DECLARE @maxId int; SELECT @maxId = ISNULL(MAX(ID), ' + CASE WHEN @tableName = 'T_DICTIONARYITEMBASE' THEN '100000' ELSE '0' END + ') FROM ' + @tableName + '; INSERT INTO MappingTable (tableName, oldId, [newId]) SELECT DISTINCT ''' + @tableName + ''', ID, RANK() OVER(ORDER BY ID) + @maxId FROM ' + @pSourceDatabase + '.dbo.' + @tableName + ' WHERE C_INTEZMENYID = @intId ' IF @tableName = 'T_DICTIONARYITEMBASE' BEGIN SET @sql += ' AND ID >= 100000;' END SET @sql += N' SET @rowCount = @@ROWCOUNT' IF @pDebugMode = 1 RAISERROR (@sql, 10, 1) WITH NOWAIT EXEC sp_executesql @sql, N'@intId int, @rowCount int output', @pSourceIntezmenyId, @rowCount output SET @message = ' MP ' + FORMAT(GETDATE(), 'HH:mm:ss.ff') + ' - ' + @tableName + ' - ' + CAST(@rowCount AS nvarchar(20)) + ' sor' RAISERROR (@message, 10, 1) WITH NOWAIT FETCH NEXT FROM tbl_cur INTO @tableName, @isIdentity END CLOSE tbl_cur DEALLOCATE tbl_cur -- ============================================================== -- -- Mapping tábla feltöltése: nem IDENTITY() táblákból -- -- ============================================================== -- DECLARE tbl_cur CURSOR LOCAL FOR SELECT DISTINCT TABLE_NAME, COLUMNPROPERTY(OBJECT_ID(TABLE_NAME), 'ID', 'IsIdentity') FROM INFORMATION_SCHEMA.COLUMNS c WHERE COLUMN_NAME = N'C_ALINTEZMENYID' AND TABLE_NAME IN (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA = 'dbo') AND TABLE_NAME NOT IN (N'T_ENTITYATTRIBUTEHISTORY', N'T_ENTITYHISTORY', N'T_DICTIONARYTYPE') AND TABLE_SCHEMA = 'dbo' AND COLUMNPROPERTY(OBJECT_ID(TABLE_NAME), 'ID', 'IsIdentity') = 0 ORDER BY TABLE_NAME OPEN tbl_cur FETCH NEXT FROM tbl_cur INTO @tableName, @isIdentity WHILE @@FETCH_STATUS = 0 BEGIN SELECT @mainTableName = OBJECT_NAME(referenced_object_id) FROM sys.foreign_key_columns f INNER JOIN sys.columns rc ON rc.[object_id] = f.referenced_object_id AND rc.column_id = f.referenced_column_id INNER JOIN sys.columns pc ON pc.[object_id] = f.parent_object_id AND rc.column_id = f.parent_column_id WHERE parent_object_id = OBJECT_ID(@tableName) AND rc.[name] = 'ID' AND pc.[name] = 'ID' SET @sql = N' INSERT INTO MappingTable (tableName, oldId, [newId]) SELECT DISTINCT ''' + @tableName + ''', t.oldId, t.[newId] FROM ' + @pSourceDatabase + '.dbo.' + @tableName + ' s INNER JOIN MappingTable t ON t.oldId = s.ID AND t.tableName = @mainTableName WHERE s.C_ALINTEZMENYID = @intId SET @rowCount = @@ROWCOUNT ' IF @pDebugMode = 1 RAISERROR (@sql, 10, 1) WITH NOWAIT EXEC sp_executesql @sql, N'@intId int, @mainTableName nvarchar(50), @rowCount int output', @pSourceIntezmenyId, @mainTableName, @rowCount output SET @message = ' MP ' + FORMAT(GETDATE(), 'HH:mm:ss.ff') + ' - ' + @tableName + ' - ' + CAST(@rowCount AS nvarchar(20)) + ' sor' RAISERROR (@message, 10, 1) WITH NOWAIT FETCH NEXT FROM tbl_cur INTO @tableName, @isIdentity END CLOSE tbl_cur DEALLOCATE tbl_cur -- ============================================================== -- -- MappingTable indexek -- -- ============================================================== -- CREATE CLUSTERED INDEX IX_MappingTable_01 ON MappingTable (oldId, [newId], tableName) CREATE INDEX IX_MappingTable_02 ON MappingTable (tableName, oldId, [newId]) SET @message = 'POPULATE MAPPINGTABLE DONE - ' + FORMAT(GETDATE(), 'hh:mm:ss.ff') RAISERROR (@message, 10, 1) WITH NOWAIT END GO