shaileshpatangay
Starting Member
4 Posts |
Posted - 2009-06-29 : 09:39:15
|
Create your own DTS Transformation using stored procedures.set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgoUSE [msdb]CREATE TABLE [dbo].[RefreshTable]( [RowId] [int] IDENTITY(1,1) NOT NULL, [SourceServerName] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [SourceDBName] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [SourceObjectOwner] [varchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [SourceTableName] [varchar](300) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [SourceColumnName] [varchar](300) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [DestinationServerName] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [DestinationDBName] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [DestinationObjectOwner] [varchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [DestinationTableName] [varchar](300) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [DestinationColumnName] [varchar](300) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL, [ColumnOrder] [int] NULL, [ProcessedOn] [datetime] NOT NULL CONSTRAINT [DF_RefreshTable_ProcessedOn] DEFAULT (getdate()), [Validate] [varchar](1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL CONSTRAINT [DF_RefreshTable_Validate] DEFAULT ('N'), [Enabled] [varchar](1) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL CONSTRAINT [DF_RefreshTable_Enabled] DEFAULT ('Y'), CONSTRAINT [IX_RefreshTable] UNIQUE NONCLUSTERED ( [SourceServerName] ASC, [SourceDBName] ASC, [SourceObjectOwner] ASC, [SourceTableName] ASC, [SourceColumnName] ASC) ON [PRIMARY]) ON [PRIMARY]GO/*-----------------------------------------------------------------------------------** Author : Shailesh Patangay** Description : Copies the data from Source Database to Destination Databases.**-----------------------------------------------------------------------------------** Following is a example for executing the DTS with mode 0.** Exec [master].[dbo].[DBA_RefreshTable] @DBName = 'DBName' ,@mode = 2**------------------------------------------------------------------------------------*/Create Proc [dbo].[DBA_RefreshTable]@DBName varchar(1000),@mode int = nullasSET NOCOUNT ON IF @mode is nullBEGINset @mode = 0ENDupdate msdb.dbo.RefreshTable set validate = 'Y' where DestinationDbname = @DBName/*** validate column exists in the Source Database.Table*/declare @RowID bigintdeclare @SourceServerName varchar(300) declare @SourceDBName varchar(300)declare @SourceObjectOwner varchar(300)declare @SourceTableName varchar(300)declare @SourceColumnName varchar(300)declare @DestinationServerName varchar(300)declare @DestinationObjectOwner varchar(300)declare @DestinationDBName varchar(300)declare @DestinationTableName varchar(300)declare @DestinationColumnName varchar(300)declare @ColumnOrder intdeclare @ProcessedOn datetimedeclare @Validate varchar(1)declare @Enabled varchar(1)declare @str varchar(8000)declare @strCol varchar(8000)declare @RaiseErrorStr varchar(1000)/*** make sure the linked server is present.*/DECLARE cur_validate_Linked_Server CURSORREAD_ONLYFOR select Distinct SourceServerName from msdb.dbo.RefreshTable where enabled = 'Y'OPEN cur_validate_Linked_ServerFETCH NEXT FROM cur_validate_Linked_Server INTO @SourceServerNameWHILE (@@fetch_status <> -1)BEGIN IF (@@fetch_status <> -2) BEGIN IF NOT EXISTS (select * from master.dbo.sysservers where srvname = @SourceServerName) BEGIN EXEC master.dbo.sp_addlinkedserver @server = @SourceServerName , @srvproduct=N'SQL Server' EXEC master.dbo.sp_serveroption @server=@SourceServerName , @optname=N'collation compatible' , @optvalue=N'false' EXEC master.dbo.sp_serveroption @server=@SourceServerName , @optname=N'data access' , @optvalue=N'true' EXEC master.dbo.sp_serveroption @server=@SourceServerName , @optname=N'dist' , @optvalue=N'false' EXEC master.dbo.sp_serveroption @server=@SourceServerName , @optname=N'pub' , @optvalue=N'false' EXEC master.dbo.sp_serveroption @server=@SourceServerName , @optname=N'rpc' , @optvalue=N'true' EXEC master.dbo.sp_serveroption @server=@SourceServerName , @optname=N'rpc out' , @optvalue=N'true' EXEC master.dbo.sp_serveroption @server=@SourceServerName , @optname=N'sub' , @optvalue=N'false' EXEC master.dbo.sp_serveroption @server=@SourceServerName , @optname=N'dpub' , @optvalue=N'false' EXEC master.dbo.sp_serveroption @server=@SourceServerName , @optname=N'connect timeout' , @optvalue=N'0' EXEC master.dbo.sp_serveroption @server=@SourceServerName , @optname=N'collation name' , @optvalue=null EXEC master.dbo.sp_serveroption @server=@SourceServerName , @optname=N'lazy schema validation', @optvalue=N'false' EXEC master.dbo.sp_serveroption @server=@SourceServerName , @optname=N'query timeout' , @optvalue=N'0' EXEC master.dbo.sp_serveroption @server=@SourceServerName , @optname=N'use remote collation' , @optvalue=N'false' END END FETCH NEXT FROM cur_validate_Linked_Server INTO @SourceServerNameENDCLOSE cur_validate_Linked_ServerDEALLOCATE cur_validate_Linked_Server/*** Validate the Destination DB Exists.*/update msdb.dbo.RefreshTableset validate = 'N'where DestinationDBName not in (select name from master.dbo.sysdatabases)and Enabled = 'Y'and DestinationDBName = @DBNameIF exists (select top 1 * from msdb.dbo.RefreshTable where enabled = 'Y' and validate = 'N' and DestinationDBName = @DBName)BEGIN set @RaiseErrorStr = '-----------------------------------------------------------------------------------Validation Destination Database entered, please make sure that the Destination Db Exists. -----------------------------------------------------------------------------------Run : select * from msdb.dbo.RefreshTable where enabled = ''Y'' and validate = ''N'' and DestinationDBName = '''+@DBName+'''-------------------------------------------------------------------------------------' RAISERROR (@RaiseErrorStr, 16, 1) RETURNEND /*** Validate if the source Table exists*/create Table #TempT1 (name varchar(4000))DECLARE cur_validate_columns CURSORREAD_ONLYFOR select Distinct SourceServerName ,SourceDBName ,SourceObjectOwner ,SourceTableNameFROM msdb.dbo.RefreshTablewhere Enabled = 'Y' and DestinationDBName = @DBNameOPEN cur_validate_columnsFETCH NEXT FROM cur_validate_columns INTO @SourceServerName ,@SourceDBName ,@SourceObjectOwner ,@SourceTableNameWHILE (@@fetch_status <> -1)BEGIN IF (@@fetch_status <> -2) BEGIN set @str = 'select so.namefrom ['+@SourceServerName+'].['+@SourceDBName+'].['+@SourceObjectOwner+'].[sysobjects] sowhere so.name = '''+@SourceTableName+'''' Truncate Table #TempT1 Insert into #TempT1 Exec(@str)-- print @str IF (select count(*) from #TempT1) > 0 BEGIN UPDATE msdb.dbo.RefreshTable SET Validate = 'Y' where SourceServerName = @SourceServerName and SourceDBName = @SourceDBName and SourceObjectOwner = @SourceObjectOwner and SourceTableName = @SourceTableName END ELSE BEGIN UPDATE msdb.dbo.RefreshTable SET Validate = 'N' where SourceServerName = @SourceServerName and SourceDBName = @SourceDBName and SourceObjectOwner = @SourceObjectOwner and SourceTableName = @SourceTableName END END FETCH NEXT FROM cur_validate_columns INTO @SourceServerName ,@SourceDBName ,@SourceObjectOwner ,@SourceTableNameENDCLOSE cur_validate_columnsDEALLOCATE cur_validate_columnsIF exists (select top 1 * from msdb.dbo.RefreshTable where enabled = 'Y' and validate = 'N' and DestinationDBName = @DBName)BEGIN set @RaiseErrorStr = '-----------------------------------------------------------------------------------Validation Failed for Source Tables , Check table RefreshTable. -----------------------------------------------------------------------------------select * from msdb.dbo.RefreshTable where enabled = ''Y'' and validate = ''N''and DestinationDBName = '''+@DBName+'''------------------------------------------------------------------------------------' RAISERROR (@RaiseErrorStr, 16, 1) RETURNEND /*** Validate if the source colum exists */DECLARE cur_validate_columns CURSORREAD_ONLYFOR select Distinct RowID ,SourceServerName ,SourceDBName ,SourceObjectOwner ,SourceTableName ,SourceColumnNameFROM msdb.dbo.RefreshTablewhere Enabled = 'Y' and DestinationDBName = @DBNameorder by RowIDOPEN cur_validate_columnsFETCH NEXT FROM cur_validate_columns INTO @RowID ,@SourceServerName ,@SourceDBName ,@SourceObjectOwner ,@SourceTableName ,@SourceColumnNameWHILE (@@fetch_status <> -1)BEGIN IF (@@fetch_status <> -2) BEGIN set @str = 'select sc.namefrom ['+@SourceServerName+'].['+@SourceDBName+'].['+@SourceObjectOwner+'].[syscolumns] sc JOIN ['+@SourceServerName+'].['+@SourceDBName+'].['+@SourceObjectOwner+'].[sysobjects] so on sc.id = so.idwhere so.name = '''+@SourceTableName+''' and sc.name = '''+@SourceColumnName+'''' Truncate Table #TempT1 Insert into #TempT1 Exec(@str)-- print @str IF (select count(*) from #TempT1) > 0 BEGIN UPDATE msdb.dbo.RefreshTable SET Validate = 'Y' where RowID = @RowID END ELSE BEGIN UPDATE msdb.dbo.RefreshTable SET Validate = 'N' where RowID = @RowID END END FETCH NEXT FROM cur_validate_columns INTO @RowID ,@SourceServerName ,@SourceDBName ,@SourceObjectOwner ,@SourceTableName ,@SourceColumnNameENDCLOSE cur_validate_columnsDEALLOCATE cur_validate_columnsIF exists (select top 1 * from msdb.dbo.RefreshTable where enabled = 'Y' and validate = 'N'and DestinationDBName = @DBName)BEGIN set @RaiseErrorStr = '-----------------------------------------------------------------------------------Validation Failed for Source Columns, Check table RefreshTable. -----------------------------------------------------------------------------------select * from msdb.dbo.RefreshTable where enabled = ''Y'' and validate = ''N''and DestinationDBName = '''+@DBName+'''------------------------------------------------------------------------------------' RAISERROR (@RaiseErrorStr, 16, 1) RETURNEND/*** Prepare Sql Statement*/DECLARE Cur_Prepare_Statement CURSORREAD_ONLYFOR select Distinct SourceServerName ,SourceDBName ,SourceObjectOwner ,SourceTableNameFROM msdb.dbo.RefreshTablewhere Enabled = 'Y' and DestinationDBName = @DBName Order by SourceTableNameDECLARE @name varchar(40)OPEN Cur_Prepare_StatementFETCH NEXT FROM Cur_Prepare_Statement INTO @SourceServerName ,@SourceDBName ,@SourceObjectOwner ,@SourceTableNameWHILE (@@fetch_status <> -1)BEGIN IF (@@fetch_status <> -2) BEGIN set @strCol = '' select @strCol = @strCol + SourceColumnName + ' As ' + DestinationColumnName + ',' from msdb.dbo.RefreshTable where SourceServerName = @SourceServerName and SourceDBName = @SourceDBName and SourceObjectOwner = @SourceObjectOwner and SourceTableName = @SourceTableName order by ColumnOrder/*** Get the top 1 name from refresh table for Destination DB Name.*/ set @DestinationDBName = (select top 1 DestinationDBName from msdb.dbo.RefreshTable where SourceServerName = @SourceServerName and SourceDBName = @SourceDBName and SourceObjectOwner = @SourceObjectOwner and SourceTableName = @SourceTableName)/*** Get the top 1 name from refresh table for Destination Object Owner.*/ set @DestinationObjectOwner = (select top 1 DestinationObjectOwner from msdb.dbo.RefreshTable where SourceServerName = @SourceServerName and SourceDBName = @SourceDBName and SourceObjectOwner = @SourceObjectOwner and SourceTableName = @SourceTableName)/*** Get the top 1 name from refresh table for Destination Table Name.*/ set @DestinationTableName = (select top 1 DestinationTableName from msdb.dbo.RefreshTable where SourceServerName = @SourceServerName and SourceDBName = @SourceDBName and SourceObjectOwner = @SourceObjectOwner and SourceTableName = @SourceTableName) set @Str = '/*** Drops the table if exists*/IF exists (select * from ['+@DestinationDBName+'].dbo.sysobjects where type = ''u'' and name = '''+@DestinationTableName+''')BEGINDROP TABLE ['+@DestinationDBName+'].dbo.'+@DestinationTableName+'END' If @mode = 0 BEGIN print @Str Exec (@Str) END else IF @mode = 1 BEGIN Exec (@Str) END else BEGIN print @Str ENDset @strCol = '/*** Bulk Copies the data from remote server.*/SELECT '+ substring(@strCol,1, len(@strCol)-1) + ' INTO ['+@DestinationDBName+'].['+@DestinationObjectOwner+'].['+@DestinationTableName+'] FROM [' + @SourceServerName +'].['+ @SourceDBName+'].['+@SourceObjectOwner+'].['+@SourceTableName+']' If @mode = 0 BEGIN print @strCol Exec (@strCol) END else IF @mode = 1 BEGIN Exec (@strCol) END else BEGIN print @strCol END END/*** UPDATE the Processed Data field, in the refresh table.*/UPDATE msdb.dbo.refreshtableset ProcessedOn = getdate()where DestinationDBName = @DestinationDBName and DestinationObjectOwner = @DestinationObjectOwner and DestinationTableName = @DestinationTableName FETCH NEXT FROM Cur_Prepare_Statement INTO @SourceServerName ,@SourceDBName ,@SourceObjectOwner ,@SourceTableNameENDCLOSE Cur_Prepare_StatementDEALLOCATE Cur_Prepare_Statement cheersshailesh patangay |
|