Technical Article

Create T-SQL Scripts for every table in the DB (in T-SQL)

,

This script will create scripts for every Table.
This makes it easy to check them in to VSS.

Usage :
DMOScriptTables 'Databasename','Directoryname'


create procedure dbo.dmoScriptTables
@pDatabaseName varchar(255),
@workingfolder varchar(255) = null,
        @pInstanceName varchar(30) = null
as
-- common
declare @dmoServer int,
@path varchar(255),
@cmd varchar(1200),
@returnstatus int,
@dmoMethod varchar(255), 
@dmoProperty varchar(255), 
@dmoCollection varchar(255), 
@scriptFile varchar(255),
@hr int,
@oleErrorSource varchar(255),
@oleErrorDescription varchar(1000),
@scriptType int,
@procedureName sysname,
        @Processflowerror varchar(255), 
        @pTempFolder varchar(255),
--tables
@isSystemTable tinyint,
@tableCount int,
@curTableNb int,
@tableName varchar(256),
@tableScriptType int,
@permissionsScriptType int,
        @firstTable bit,
        @permissionsScriptFile varchar(255),
-- keys
@keyCount int,
@curKeyNb int,
@keyName varchar(255),
@keyType int,
-- dridefaults
@columnCount int,
@curColumnNb int,
@objectName varchar(255),
@DRIDefaultName varchar(255),
-- indexes
@indexCount int,
@curIndexNb int,
@indexName varchar(256),
@indexType int,
-- checks
@checkCount int,
@curCheckNb int,
@checkName varchar(256),
-- triggers
@triggerCount int,
@curTriggerNb int,
@triggerName varchar(256)

-- Directory Structure Temp Directory 
Declare @prefix varchar(1000) 
Declare @prefix_fil  varchar (1000) 
Declare @prefix_tab varchar (1000) 
Declare @prefix_cns varchar (1000) 
Declare @prefix_viw varchar (1000) 
Declare @prefix_trg varchar (1000) 
Declare @prefix_rul varchar (1000) 
Declare @prefix_ind varchar (1000) 
Declare @prefix_prc varchar (1000) 
Declare @prefix_udf varchar (1000) 
Declare @prefix_def varchar (1000) 
Declare @prefix_ftc varchar (1000) 
Declare @prefix_rol varchar (1000) 
Declare @prefix_udt varchar (1000) 
Declare @prefix_usr varchar (1000) 
-- Memory Table For logging 
Declare @ActivityLog table 
( id int identity, 
  activity varchar(1000)) 

-- Ok here we begin with the stuff 

set nocount on 
set @Processflowerror = '' 
set @prefix = @workingFolder + '\DB-Framework\' 
set @prefix_fil  = @prefix + '01. Filegroups\' 
set @prefix_tab = @prefix + '02. Tables (only columns)\' 
set @prefix_cns = @prefix + '03. PK + FKs + Constraints\' 
set @prefix_viw = @prefix + '04. Views\' 
set @prefix_trg = @prefix + '06. Triggers\' 
set @prefix_rul = @prefix + '07. Rules\' 
set @prefix_ind = @prefix + '08. Indexes\' 
set @prefix_prc = @prefix + '09. Stored Procedures\' 
set @prefix_udf = @prefix + '10. User Defined Functions\' 
set @prefix_def = @prefix + '11. Defaults\' 
set @prefix_FTC = @prefix + '12. Full Text Catalogs\' 
set @prefix_rol = @prefix + '13. Roles\' 
set @prefix_UDT = @prefix + '14. User Defined Datatypes\' 
set @prefix_USR = @prefix + '15. Database users\' 

-- init
set @procedureName = db_name() + '.' 
+ user_name(objectproperty(@@procid,'OwnerId')) 
                + '.' + object_name(@@procid)

-- table script options
set @tableScriptType         = 4 -- primary object
                + 64 -- to
        + 512-- no DRI 
        + 4096 -- if not exists
        + 262144-- owner qualify

-- permissions script options
set @permissionsScriptType = 2 -- object permissions
        + 32 -- database (statement) permissions
--                              + 256           -- append (add this after first table inits the file)  
set @permissionsScriptFile = @path + 'allTablePermissions.sql'
set @firstTable = 0

-- constraint, index and trigger script options
set @scriptType         = 1-- drop 
        + 4-- primary object
        + 64-- to file only
        + 4096-- if not exists
        + 262144-- owner qualify

-- open an in-process COM/DMO connection to this server
exec @hr = master..sp_OACreate 'SQLDMO.SQLServer', @dmoServer OUT
if @hr <> 0 goto ErrorHandler

-- set the security context to integrated 
exec @hr = master..sp_OASetProperty @dmoServer,'loginSecure',1
if @hr <> 0 goto ErrorHandler

-- connect to the specified server 
exec @hr = master..sp_OAMethod @dmoServer,'Connect',NULL,@@servername
if @hr <> 0 goto ErrorHandler

-- script each table and table child object to a separate file
select @dmoProperty = 'Databases("' 
+ @pDatabaseName 
+ '").Tables.Count'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@tableCount OUT
if @hr <> 0 goto ErrorHandler
select @curTableNb = 1
while @curTableNb <= @tableCount   
begin
                print str(@Tablecount)
-- refresh the DMO buffers each iteration
select @dmoMethod = 'Databases("' 
+ @pDatabaseName 
+ '").Tables.Refresh(TRUE)'
exec @hr = master.dbo.sp_OAMethod @dmoServer,
@dmoMethod,
NULL
if @hr <> 0 goto ErrorHandler

select @dmoProperty = 'Databases("' 
+ @pDatabaseName 
+ '").Tables.Item(' 
+ cast(@curTableNb as varchar(10)) 
+ ').SystemObject'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@isSystemTable OUT
if @hr <> 0 goto ErrorHandler
-- only script user table
if @isSystemTable = 0 
begin
-- get the table name 
select @dmoProperty = 'Databases("' 
+ @pDatabaseName 
+ '").Tables.Item(' 
+ cast(@curTableNb as varchar(10)) 
+ ').Name'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@tableName OUT
if @hr <> 0 goto ErrorHandler
select @dmoMethod = 'Databases("' 
+ @pDatabaseName 
+ '").Tables("' 
+ @tableName 
+ '").Script'

-- put each table script in its own file 
select @scriptFile = @prefix_tab + @tableName + '.sql'
exec @hr = master.dbo.sp_OAMethod @dmoServer,
@dmoMethod,
NULL,
@tableScriptType,
@scriptFile
if @hr <> 0 goto ErrorHandler

-- put all table permissions in one file 
exec @hr = master.dbo.sp_OAMethod @dmoServer,
@dmoMethod,
NULL,
@permissionsScriptType,
@permissionsScriptFile
if @hr <> 0 goto ErrorHandler
                                -- append all remaining permissions to this file
                                if @firstTable = 0
                                        begin
                                                set @permissionsScriptType = @permissionsScriptType + 256
                                                set @firstTable = 1
                                        end
                                
--keys
set @keyType = 0
select @dmoProperty = 'Databases("' + 
@pDatabaseName 
+ '").Tables("' 
+ @tableName 
+ '").Keys.Count'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@keyCount OUT
if @hr <> 0 goto ErrorHandler
set @curKeyNb = 1
while @curKeyNb <= @keyCount 
begin
select @dmoProperty = 'Databases("' 
+ @pDatabaseName 
+ '").Tables("' 
+ @tableName 
+ '").Keys(' 
+ cast(@curKeyNb as varchar(10)) 
+ ').type'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@keyType OUT
if @hr <> 0 goto ErrorHandler
select @dmoProperty = 'Databases("' 
+ @pDatabaseName 
+ '").Tables("' 
+ @tableName 
+ '").Keys(' 
+ cast(@curKeyNb as varchar(10)) 
+ ').Name'
exec @hr = master.dbo.sp_OAGetProperty 
@dmoServer,
@dmoProperty,
@keyName OUT                
if @hr <> 0 goto ErrorHandler
if @keyName <> ''
begin
select @dmoMethod = 'Databases("' 
+ @pDatabaseName 
+ '").Tables("' 
                                        + @tableName 
+ '").Keys(' 
+ cast(@curKeyNb as varchar(10)) 
                                        + ').Script'
if @keyType = 1   
set @scriptFile = @prefix_cns + @keyName + '_PK.sql'
if @keyType = 2
set @scriptFile = @prefix_cns + @keyName + '_UNIQUE.sql'
if @keyType = 3
set @scriptFile = @prefix_cns + @keyName + '_FK.sql'
exec @hr = master.dbo.sp_OAMethod @dmoServer,
@dmoMethod,
NULL,
@scriptType,
@scriptFile
if @hr <> 0 goto ErrorHandler
end
set @curKeyNb = @curKeyNb + 1
end 

--DRI Defaults
set @curColumnNb = 1
select @dmoProperty = 'Databases("' 
+ @pDatabaseName 
+ '").Tables("' 
+ @tableName 
+ '").Columns.Count'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@columnCount OUT                
if @hr <> 0 goto ErrorHandler
while @curColumnNb <= @columnCount
begin
                select @dmoProperty = 'Databases("' 
+ @pDatabaseName 
+ '").Tables("' 
                        + @tableName 
+ '").Columns(' 
+ cast(@curColumnNb as varchar(10)) 
+ ').DRIDefault.Name'
                exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@DRIDefaultName OUT                
                if @hr <> 0 goto ErrorHandler
                if @DRIDefaultName <> ''
                        begin
                                select @scriptFile = @prefix_cns + @keyName + '_DRI.sql'
                                select @dmoMethod = 'Databases("' 
+ @pDatabaseName 
+ '").Tables("' 
                                        + @tableName 
+ '").Columns(' 
+ cast(@curColumnNb as varchar(10)) 
                                        + ').DRIDefault.Script'
                                exec @hr = master.dbo.sp_OAMethod @dmoServer,
@dmoMethod,
NULL,
@scriptType,
@scriptFile
                                if @hr <> 0 goto ErrorHandler
                        end
                set @curColumnNb = @curColumnNb + 1
        end

--Indexes
set @curIndexNb = 1
select @dmoProperty = 'Databases("' 
+ @pDatabaseName 
+ '").Tables("' 
+ @tableName 
+ '").Indexes.Count'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@indexCount OUT
if @hr <> 0 goto ErrorHandler
while @curIndexNb <= @indexCount
        begin
select @dmoProperty = 'Databases("' 
+ @pDatabaseName 
+ '").Tables("' 
+ @tableName 
+ '").Indexes(' 
+ cast(@curIndexNb as varchar(10)) 
+ ').Type'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@indexType OUT
if @hr <> 0 goto ErrorHandler
-- don't script Primary Keys or Unique Constraints here
if (not(@indexType & 2048 = 2048) 
and not(@indexType & 4096 = 4096))
begin
select @dmoProperty = 'Databases("' 
+ @pDatabaseName 
+ '").Tables("' 
+ @tableName 
+ '").Indexes(' 
+ cast(@curIndexNb as varchar(10)) 
+ ').Name'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@indexName OUT
if @hr <> 0 goto ErrorHandler
select @scriptFile = @prefix_ind + @indexName + '.IDX' 
select @dmoMethod = 'Databases("' 
+ @pDatabaseName 
+ '").Tables("' 
+ @tableName 
+ '").Indexes(' 
+ cast(@curIndexNb as varchar(10)) 
+ ').Script'
exec @hr = master.dbo.sp_OAMethod @dmoServer,
@dmoMethod,
NULL,
@scriptType,
@scriptFile
if @hr <> 0 goto ErrorHandler
end
set @curIndexNb = @curIndexNb + 1
end

--checks
set @curCheckNb = 1
select @dmoProperty = 'Databases("' 
+ @pDatabaseName 
+ '").Tables("' 
+ @tableName 
+ '").Checks.Count'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@checkCount OUT
if @hr <> 0 goto ErrorHandler
while @curCheckNb <= @checkCount
begin
select @dmoProperty = 'Databases("' 
+ @pDatabaseName 
+ '").Tables("' 
+ @tableName 
+ '").Checks(' 
+ cast(@curCheckNb as varchar(10)) 
+ ').Name'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@checkName OUT
if @hr <> 0 goto ErrorHandler
select @scriptFile = @prefix_cns+ @CheckName + '.chk' 
select @dmoMethod = 'Databases("' 
+ @pDatabaseName 
+ '").Tables("' 
+ @tableName 
+ '").Checks(' 
+ cast(@curCheckNb as varchar(10)) 
+ ').Script'
exec @hr = master.dbo.sp_OAMethod @dmoServer,
@dmoMethod,
NULL,
@scriptType,
@scriptFile
if @hr <> 0 goto ErrorHandler
set @curCheckNb = @curCheckNb + 1
end

--triggers
set @curTriggerNb = 1
select @dmoProperty = 'Databases("' 
+ @pDatabaseName 
+ '").Tables("' 
+ @tableName 
+ '").Triggers.Count'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@triggerCount OUT
if @hr <> 0 goto ErrorHandler
while @curTriggerNb <= @triggerCount
begin
select @dmoProperty = 'Databases("' 
+ @pDatabaseName 
+ '").Tables("' 
+ @tableName 
+ '").Triggers(' 
+ cast(@curTriggerNb as varchar(10)) 
+ ').Name'
exec @hr = master.dbo.sp_OAGetProperty @dmoServer,
@dmoProperty,
@triggerName OUT
if @hr <> 0 goto ErrorHandler
select @scriptFile = @prefix_trg +  @triggerName + '.trg' 
select @dmoMethod = 'Databases("' 
+ @pDatabaseName 
+ '").Tables("' 
+ @tableName 
+ '").Triggers(' 
+ cast(@curTriggerNb as varchar(10)) 
+ ').Script'
exec @hr = master.dbo.sp_OAMethod @dmoServer,
@dmoMethod,
NULL,
@scriptType,
@scriptFile
if @hr <> 0 goto ErrorHandler

set @curTriggerNb = @curTriggerNb + 1
end
end
select @curTableNb = @curTableNb + 1
end

-- close and cleanup the COM/DMO database connection 
exec @hr = master.dbo.sp_OAMethod @dmoServer,'DisConnect' 
if @hr <> 0 
        goto ErrorHandler 
exec @hr = master.dbo.sp_OADestroy @dmoServer 
if @hr <> 0 
        goto ErrorHandler 
-- audit completion 
select * from @Activitylog 
return 

ErrorHandler: 
insert @ActivityLog (activity) values ('Command Was :'+@Processflowerror) 
if (@hr is not null) 
        begin   
                exec master.dbo.sp_OAGetErrorInfo       @dmoServer, 
                                                        @OleErrorSource OUT, 
                                                        @OleErrorDescription OUT 
                
                insert @ActivityLog (activity) 
                select @procedureName + ' ' + @pDatabaseName 
                        + ' ended with error: ' + cast(@hr as varchar(20)) + ' 
                        OLE ERROR: ' 
                --+ isnull(Admin.dbo.binToHex (@hr),'not defined') no function in 7 so skip conversion of error number 
                + cast(@hr as varchar(20)) + ' 
                        Source: ' + isnull(@OleErrorSource,'unknown') + ' 
                        Description: ' + isnull(@OleErrorDescription,'unknown') 

                -- still need to cleanup 
                exec master.dbo.sp_OAMethod @dmoServer,'DisConnect' 
                exec master.dbo.sp_OADestroy @dmoServer 

                raiserror (59001,16,1,@procedureName) 
        end 
else 
        if @cmd is not null 
                begin 
                        insert @ActivityLog (activity) 
                        select @procedureName + ' ' + @pDatabaseName 
                                + ' ' + isNull(@pTempFolder,'') 
                                + ' failed with returnstatus ' 
                                + cast(@returnstatus as varchar(10)) + ' at: ' + @cmd 
                        raiserror(59001,16,1,@procedureName) 
                end 
        else 
                raiserror (59000,16,1,@procedureName) 
select * from @activitylog 
return -1 


GO

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating