Script to create script to copy data from two datatable when tables are equal. This code is very useful when partially we save data.We can delete data after some date but we must have a column date.

Read the conditions to run this script.

  1
  2-------------------------------
  3--  Script to create script to copy datatable betweeen two database
  4--
  5--  Condition:
  6--        We must have a primary key;
  7--        Primary key must be int;
  8--        If we use Linked server, we can not use XML column
  9--        We must run this script on database source
 10--
 11-------------------------------
 12
 13-------------------------------
 14-- SET Parameters
 15DECLARE @DBSource as nvarchar(100);
 16DECLARE @SchemaSource as nvarchar(100);
 17DECLARE @TableSource as nvarchar(100);
 18DECLARE @KeyIDSource as nvarchar(100);
 19DECLARE @CopyByRun as int;
 20DECLARE @DeleteOldDate as int;
 21DECLARE @DeleteOldDateColumn as nvarchar(100);
 22DECLARE @DeleteOldDateKeepMonths as nvarchar(100);
 23
 24DECLARE @DBDestination as nvarchar(100);
 25DECLARE @SchemaDestination as nvarchar(100);
 26DECLARE @TableDestination as nvarchar(100);
 27
 28SET @DBSource = 'NORTHWND';
 29SET @SchemaSource = 'dbo';
 30SET @TableSource = 'Orders';
 31SET @KeyIDSource = 'OrderID';
 32SET @CopyByRun = 100000;
 33SET @DeleteOldDate = 1;
 34SET @DeleteOldDateColumn = 'OrderDate';
 35SET @DeleteOldDateKeepMonths = 1;
 36
 37SET @DBDestination = 'NorthWindNEW';
 38SET @SchemaDestination = 'dbo';
 39SET @TableDestination = 'Orders';
 40-------------------------------
 41
 42SET NOCOUNT ON;
 43DECLARE @KeyId AS nvarchar(100);
 44DECLARE @TableSourceFullName AS nvarchar(500);
 45DECLARE @TableDestinationFullName AS nvarchar(500);
 46
 47SET @KeyId = <a href="mailto:'@'+@KeyIDSource">'@'+@KeyIDSource</a>;
 48SET @TableSourceFullName = @DBSource+'.'+@SchemaSource+'.'+@TableSource;
 49SET @TableDestinationFullName = @DBDestination+'.'+@SchemaDestination+'.'+@TableDestination;
 50
 51PRINT '-------------------------------------------------'
 52PRINT '-- Copy data from : ' + @TableSourceFullName
 53PRINT '--             to : ' + @TableDestinationFullName
 54PRINT '--'
 55PRINT '-- Each time this script copy ' + cast(@CopyByRun as nvarchar(100)) + ' rows'
 56if (@DeleteOldDate=1) PRINT '-- Delete old data of ' + @TableSourceFullName + ' after ' + cast(@DeleteOldDateKeepMonths as nvarchar(100)) + ' month'
 57PRINT '--'
 58PRINT '-- Sozezzo ' + cast(GETDATE() as nvarchar(100));
 59PRINT '-------------------------------------------------'
 60PRINT ''
 61
 62BEGIN TRY DROP TABLE #TMP END TRY BEGIN CATCH END CATCH;
 63SELECT
 64     TABLE_SCHEMA
 65    ,TABLE_NAME
 66    ,ORDINAL_POSITION AS rownumber
 67    ,COLUMN_NAME AS 'ColumnName'
 68    ,DATA_TYPE + CASE WHEN CHARacter_maximum_length IS NOT NULL THEN '(' + CAST(CHARacter_maximum_length AS NVARCHAR(100)) + ')' ELSE '' END AS 'DataType'
 69    ,IS_NULLABLE
 70INTO #TMP
 71FROM INFORMATION_SCHEMA.COLUMNS
 72WHERE TABLE_SCHEMA = @SchemaSource AND TABLE_NAME = @TableSource;
 73
 74DECLARE @SQL AS NVARCHAR(MAX);
 75DECLARE @ColumnList AS NVARCHAR(MAX);
 76SET @ColumnList  = ''
 77
 78SELECT @ColumnList = @ColumnList
 79        + CASE WHEN @ColumnList = '' THEN ' ' ELSE ', ' END
 80  + '['+ColumnName+']'
 81FROM #TMP WHERE ColumnName <> 'Timestamp';
 82
 83PRINT 'DECLARE '+ @KeyId + ' as int;';
 84PRINT ''
 85PRINT 'SELECT ' + @KeyId + ' = ISNULL(MAX(<a href="mailto:'+@KeyIDSource+'),0">'+@KeyIDSource+'),0</a>) FROM <a href="mailto:'+@TableDestinationFullName+';'">'+@TableDestinationFullName+';'</a>;
 86PRINT ''
 87PRINT 'SET IDENTITY_INSERT <a href="mailto:'+@TableDestinationFullName+'">'+@TableDestinationFullName+'</a> ON;'
 88PRINT ''
 89PRINT '-- INSERT DATA'
 90PRINT 'INSERT INTO ' + @TableDestinationFullName ;
 91PRINT '             ('+ @ColumnList + ')'
 92PRINT 'SELECT TOP ('+cast(@CopyByRun as nvarchar(100))+') '
 93PRINT '              '+ @ColumnList
 94PRINT 'FROM  ' + @TableSourceFullName
 95PRINT 'WHERE (<a href="mailto:'+@KeyIDSource+'">'+@KeyIDSource+'</a> > <a href="mailto:'+@KeyId+')'">'+@KeyId+')'</a>
 96PRINT 'ORDER BY <a href="mailto:'+@KeyIDSource+';'">'+@KeyIDSource+';'</a>
 97PRINT ''
 98PRINT 'SET IDENTITY_INSERT <a href="mailto:'+@TableDestinationFullName+'">'+@TableDestinationFullName+'</a> OFF;'
 99
100IF (@DeleteOldDate = 1)
101BEGIN
102
103PRINT ''
104PRINT '-- DELETE OLD DATA'
105PRINT 'DECLARE @n INT;'
106PRINT 'SELECT ' + @KeyId + ' = ISNULL(MAX(<a href="mailto:'+@KeyIDSource+'),0">'+@KeyIDSource+'),0</a>) FROM <a href="mailto:'+@TableDestinationFullName+';'">'+@TableDestinationFullName+';'</a>;
107PRINT 'SELECT TOP 1 @n = MAX(['+@KeyIDSource+']) FROM <a href="mailto:'+@TableSourceFullName">'+@TableSourceFullName</a>;
108PRINT 'WHERE ['+@DeleteOldDateColumn+'] < DATEADD(month, -'+cast(@DeleteOldDateKeepMonths as nvarchar(100))+', GETUTCDATE());'
109PRINT ''
110PRINT 'IF ( @n IS NOT NULL )'
111PRINT 'BEGIN'
112PRINT '    IF (<a href="mailto:'+@KeyId+'">'+@KeyId+'</a> > @n ) SET <a href="mailto:'+@KeyId+'">'+@KeyId+'</a> = @n;'
113PRINT '    -- PRINT <a href="mailto:'+@KeyId+';'">'+@KeyId+';'</a>
114PRINT '    DELETE FROM '+ @TableSourceFullName + ' WHERE <a href="mailto:'+@KeyIDSource+'">'+@KeyIDSource+'</a> < ' + @KeyId + ';'
115PRINT 'END'
116PRINT ''
117PRINT '-- SELECT TOP 100 * FROM '+ @TableDestinationFullName+';';
118PRINT '-- SELECT TOP 100 * FROM '+ @TableSourceFullName+';';
119END

Result:

 1
 2-------------------------------------------------
 3-- Copy data from : NORTHWND.dbo.Orders
 4--             to : NorthWindNEW.dbo.Orders
 5--
 6-- Each time this script copy 100000 rows
 7-- Delete old data of NORTHWND.dbo.Orders after 1 month
 8--
 9-- Sozezzo Apr 28 2015 11:38AM
10-------------------------------------------------
11
12DECLARE @OrderID as int;
13
14SELECT @OrderID = ISNULL(MAX(OrderID),0) FROM NorthWindNEW.dbo.Orders;
15
16SET IDENTITY_INSERT NorthWindNEW.dbo.Orders ON;
17
18-- INSERT DATA
19INSERT INTO NorthWindNEW.dbo.Orders
20             ( [OrderID], [CustomerID], [EmployeeID], [OrderDate], [RequiredDate], [ShippedDate], [ShipVia], [Freight], [ShipName], [ShipAddress], [ShipCity], [ShipRegion], [ShipPostalCode], [ShipCountry])
21SELECT TOP (100000)
22               [OrderID], [CustomerID], [EmployeeID], [OrderDate], [RequiredDate], [ShippedDate], [ShipVia], [Freight], [ShipName], [ShipAddress], [ShipCity], [ShipRegion], [ShipPostalCode], [ShipCountry]
23FROM  NORTHWND.dbo.Orders
24WHERE (OrderID > @OrderID)
25ORDER BY OrderID;
26
27SET IDENTITY_INSERT NorthWindNEW.dbo.Orders OFF;
28
29-- DELETE OLD DATA
30DECLARE @n INT;
31SELECT @OrderID = ISNULL(MAX(OrderID),0) FROM NorthWindNEW.dbo.Orders;
32SELECT TOP 1 @n = MAX([OrderID]) FROM NORTHWND.dbo.Orders
33WHERE [OrderDate] < DATEADD(month, -1, GETUTCDATE());
34
35IF ( @n IS NOT NULL )
36BEGIN
37    IF (@OrderID > @n ) SET @OrderID = @n;
38    -- PRINT @OrderID;
39    DELETE FROM NORTHWND.dbo.Orders WHERE OrderID < @OrderID;
40END
41
42-- SELECT TOP 100 * FROM NorthWindNEW.dbo.Orders;
43-- SELECT TOP 100 * FROM NORTHWND.dbo.Orders;