Dependencies for System Stored Procedure: master.dbo.sp_CompareDBTables

ReferencingFQN ReferencingType ReferencedFQN ReferencedType Depth RedHierarchy
master.dbo.sp_CompareDBTables Stored procedure master.dbo.sp_ExecTemplate Stored procedure 1 [master].[dbo].[sp_ExecTemplate]
master.dbo.sp_CompareDBTables Stored procedure msdb.dbo.sp_send_dbmail Stored procedure 1 [msdb].[dbo].[sp_send_dbmail]
master.dbo.sp_CompareDBTables Stored procedure Util.dbo.ParseDelimited SQL inline table-valued function 1 [Util].[dbo].[ParseDelimited]
master.dbo.sp_CompareDBTables Stored procedure Util.dbo.PrintLargeText Stored procedure 1 [Util].[dbo].[PrintLargeText]
master.dbo.sp_CompareDBTables Stored procedure Util.dbo.Servers View 1 [Util].[dbo].[Servers]
master.dbo.sp_CompareDBTables Stored procedure Util.dbo.StringConcat Aggregate function (CLR) 1 [Util].[dbo].[StringConcat]
master.dbo.sp_CompareDBTables Stored procedure Util.FS.AppendAllTextToFile Assembly (CLR) table-valued function 1 [Util].[FS].[AppendAllTextToFile]
master.dbo.sp_CompareDBTables Stored procedure Util.FS.GetFileInfo Assembly (CLR) table-valued function 1 [Util].[FS].[GetFileInfo]
master.dbo.sp_CompareDBTables Stored procedure Util.SE.SQLExecution Table 1 [Util].[SE].[SQLExecution]
master.dbo.sp_CompareDBTables Stored procedure Util.SE.SQLExecutionGetGroup SQL inline table-valued function 1 [Util].[SE].[SQLExecutionGetGroup]
master.dbo.sp_CompareDBTables Stored procedure Util.SE.SQLExecutionGroup Table 1 [Util].[SE].[SQLExecutionGroup]
master.dbo.sp_CompareDBTables Stored procedure Util.SE.SQLExecutionWait Stored procedure 1 [Util].[SE].[SQLExecutionWait]
master.dbo.sp_ExecTemplate Stored procedure Util.dbo.GetColumnType SQL inline table-valued function 2 [master].[dbo].[sp_ExecTemplate], [Util].[dbo].[GetColumnType]
master.dbo.sp_ExecTemplate Stored procedure Util.dbo.ParseSPDefaults Assembly (CLR) table-valued function 2 [master].[dbo].[sp_ExecTemplate], [util].[dbo].[ParseSPDefaults]
msdb.dbo.sp_send_dbmail Stored procedure msdb.dbo.get_principal_id SQL scalar function 2 [msdb].[dbo].[sp_send_dbmail], [msdb].[dbo].[get_principal_id]
msdb.dbo.sp_send_dbmail Stored procedure msdb.dbo.sp_validate_user Stored procedure 2 [msdb].[dbo].[sp_send_dbmail], [msdb].[dbo].[sp_validate_user]
msdb.dbo.sp_send_dbmail Stored procedure msdb.dbo.sysmail_principalprofile Table 2 [msdb].[dbo].[sp_send_dbmail], [msdb].[dbo].[sysmail_principalprofile]
msdb.dbo.sp_send_dbmail Stored procedure msdb.dbo.sysmail_verify_profile_sp Stored procedure 2 [msdb].[dbo].[sp_send_dbmail], [msdb].[dbo].[sysmail_verify_profile_sp]
Util.dbo.ParseDelimited SQL inline table-valued function Util.dbo.ParseDelimited_CLR Assembly (CLR) table-valued function 2 [Util].[dbo].[ParseDelimited], [Util].[dbo].[ParseDelimited_CLR]
Util.dbo.PrintLargeText Stored procedure Util.dbo.PrintLargeText_CLR Assembly (CLR) stored-procedure 2 [Util].[dbo].[PrintLargeText], [Util].[dbo].[PrintLargeText_CLR]
Util.dbo.StringConcat Aggregate function (CLR) Util.UtilClr ASSEMBLY 2 [Util].[dbo].[StringConcat], [Util].[UtilClr]
Util.FS.AppendAllTextToFile Assembly (CLR) table-valued function Util.UtilClr ASSEMBLY 2 [Util].[FS].[AppendAllTextToFile], [Util].[UtilClr]
Util.FS.GetFileInfo Assembly (CLR) table-valued function Util.UtilClr ASSEMBLY 2 [Util].[FS].[GetFileInfo], [Util].[UtilClr]
Util.SE.SQLExecutionGetGroup SQL inline table-valued function Util.SE.SQLExecutionAll View 2 [Util].[SE].[SQLExecutionGetGroup], [Util].[SE].[SQLExecutionAll]
Util.SE.SQLExecutionWait Stored procedure Util.SE.SQLExecutionAll View 2 [Util].[SE].[SQLExecutionWait], [Util].[SE].[SQLExecutionAll]
Util.SE.SQLExecutionWait Stored procedure Util.SE.SQLExecutionTracker Table 2 [Util].[SE].[SQLExecutionWait], [Util].[SE].[SQLExecutionTracker]
Util.SE.SQLExecutionWait Stored procedure Util.SE.SQLExecutionTrackerPivot View 2 [Util].[SE].[SQLExecutionWait], [Util].[SE].[SQLExecutionTrackerPivot]
msdb.dbo.sysmail_verify_profile_sp Stored procedure msdb.dbo.sysmail_profile Table 3 [msdb].[dbo].[sp_send_dbmail], [msdb].[dbo].[sysmail_verify_profile_sp], [msdb].[dbo].[sysmail_profile]
Util.SE.SQLExecutionTrackerPivot View Util.SE.SQLExecutionStatus Table 3 [Util].[SE].[SQLExecutionWait], [Util].[SE].[SQLExecutionTrackerPivot], [Util].[SE].[SQLExecutionStatus]

System Stored Procedure: master.dbo.sp_CompareDBTables

USE master
GO
IF OBJECT_ID('sp_CompareDBTables') IS NULL EXEC ('CREATE PROCEDURE sp_CompareDBTables AS SELECT 1 AS ID')
GO
ALTER PROCEDURE dbo.sp_CompareDBTables
    @SourceDatabase VARCHAR(256) = NULL,
    @DestinationDatabaseList VARCHAR(MAX) = NULL,
    @MetadataWhereClause VARCHAR(MAX) = NULL,
    @SaveToFile BIT = 0,
    @PrintReport BIT = 1,
    @recipients NVARCHAR(1000) = NULL
AS
SET NOCOUNT ON
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DECLARE @SQLExec NVARCHAR(MAX),
    @WhereClause VARCHAR(MAX),
    @SQL NVARCHAR(MAX) = NULL,
    @Error INT,
    @CompCount INT,
    @NCD VARCHAR(MAX),
    @cmd VARCHAR(1000),
    @ListFile VARCHAR(256),
    @ZipFile VARCHAR(256),
    --@NewID VARCHAR(128) = LOWER(CAST(NEWID() AS VARCHAR(128))),
    @NewID VARCHAR(128) = '8c91a03d-f9b4-46c0-a305-b5dcc79ff907',
    --@Created VARCHAR(100) = CONVERT(VARCHAR(22), GETDATE(), 126) + '-07:00',
    @Created VARCHAR(100) = '2011-09-16T13:23:33.63-04:00',
    @UserName VARCHAR(256) = SUSER_NAME(),
    @IntVal INT,
    @IsSysAdmin INT = ISNULL(IS_SRVROLEMEMBER(N'sysadmin'), 0),
    @Directory VARCHAR(256) = 'C:\Temp\',
    @ProjectFileContents VARCHAR(MAX),
    @ProjectFileName VARCHAR(1000),
    @FilePrefix VARCHAR(256) = 'TableComp',
    @Postfix VARCHAR(30) = '_' + REPLACE(REPLACE(REPLACE(REPLACE(SUBSTRING(CONVERT(VARCHAR(100), GETDATE(), 121), 5, 128), '-', ''), ' ', '_'), ':', ''), '.',
                                         '_'),
    @ProcessStart DATETIME = GETDATE()

--#region Print Exec Template
IF ISNULL(@SourceDatabase, '') = ''
    OR ISNULL(@DestinationDatabaseList, '') = ''
    BEGIN
        EXEC master.dbo.sp_ExecTemplate
            @ObjectName = 'sp_CompareDBTables',
            @PrintDefault = 0,
            @DeclareReturn = 0,
            @PrintReturnLine = 0,
            @DoNotDeclareVar = 1
        RETURN 30
    END
--#endregion
--#region Format Input
IF OBJECT_ID('tempdb..#tempinput') IS NOT NULL
    DROP TABLE #tempinput ;
WITH    s AS (SELECT    1 AS IsSource,
                        PARSENAME(LTRIM(RTRIM(@SourceDatabase)), 2) AS SERVERNAME,
                        PARSENAME(@SourceDatabase, 1) AS DatabaseName
              UNION ALL
              SELECT DISTINCT
                        0 AS IsSource,
                        PARSENAME(LTRIM(RTRIM(Field)), 2) AS SERVERNAME,
                        PARSENAME(LTRIM(RTRIM(Field)), 1) AS DatabaseName
              FROM      Util.dbo.ParseDelimited(@DestinationDatabaseList, ',')
              WHERE     field <> '')
    SELECT  IsSource,
            SERVERNAME,
            DatabaseName,
            '##' + REPLACE(SERVERNAME, '\', '_') + '_' + DatabaseName + CASE WHEN IsSource = 1 THEN '_' + @FilePrefix + '_From'
                                                                             ELSE '_To'
                                                                        END + @PostFix AS TableName,
            CASE WHEN IsSource = 0 THEN '##' + REPLACE(SERVERNAME, '\', '_') + '_' + DatabaseName + CASE WHEN IsSource = 1 THEN '_From'
                                                                                                         ELSE '_' + @FilePrefix + '_To_Result'
                                                                                                    END + @PostFix
            END AS ResultTableName
    INTO    #tempinput
    FROM    (SELECT IsSource,
                    u.SQLServerName AS SERVERNAME,
                    CASE WHEN u.SQLServerName = @@SERVERNAME THEN DB_NAME(DB_ID(DatabaseName))
                         ELSE DatabaseName
                    END AS DatabaseName
             FROM   s
             LEFT OUTER JOIN Util.dbo.Servers u ON u.SQLServerName = ISNULL(s.SERVERNAME, @@SERVERNAME)) k
--#endregion
IF @@ROWCOUNT > 2
    OR @recipients <> ''
    SET @SaveToFile = 1
--#region Populate Database List
DECLARE @DatabaseList TABLE (IsSource BIT NOT NULL,
                             SERVERNAME VARCHAR(256) NOT NULL,
                             DatabaseName VARCHAR(256) NOT NULL,
                             TableName VARCHAR(256) NOT NULL,
                             ResultTableName VARCHAR(256) NULL,
                             FILENAME VARCHAR(1000) NULL PRIMARY KEY CLUSTERED (SERVERNAME, DatabaseName)) ;
INSERT  @DatabaseList
        (IsSource,
         SERVERNAME,
         DatabaseName,
         TableName,
         ResultTableName,
         FileName)
        SELECT  a.IsSource,
                a.SERVERNAME,
                a.DatabaseName,
                a.TableName,
                a.ResultTableName,
                CASE WHEN a.IsSource = 0
                          AND @SaveToFile = 1
                     THEN @FilePrefix + @PostFix + '_' + REPLACE(b.SERVERNAME, '\', '_') + '-' + b.DatabaseName + '_VS_' + REPLACE(a.SERVERNAME,
                                                                                                                                                '\', '_') + '-'
                          + a.DatabaseName + '.sql'
                END AS FILENAME
        FROM    #tempinput a
        LEFT OUTER JOIN #tempinput b ON a.IsSource = 0
                                        AND b.IsSource = 1
SELECT  @Error = @@ERROR,
        @CompCount = @@ROWCOUNT - 1
--#endregion
--#region On Error or no target select resultset and return
IF @Error <> 0
    OR @CompCount <= 0
    BEGIN
        SELECT  IsSource,
                SERVERNAME,
                DatabaseName
        FROM    #tempinput
        RETURN 30
    END
--#endregion
IF @CompCount > 1
    AND @IsSysAdmin = 0
    BEGIN
        RAISERROR('Only sysadmin can run multiple comparisons.', 16, 1)
        SELECT  *
        FROM    @DatabaseList
        RETURN 40
    END
--#region Validate and format Where clause
SELECT  @MetadataWhereClause = NMT,
        @WhereClause = 'WHERE SchemaName NOT IN (''sys'', ''cdc'', ''Metadata'')' + ISNULL('
AND ('
 + @MetadataWhereClause + ')', '')
FROM    (SELECT NULLIF(LTRIM(RTRIM(@MetadataWhereClause)), '') AS MetadataWhereClause,
                '[' + CHAR(10) + CHAR(13) + CHAR(9) + CHAR(32) + ']' AS WhiteSpace) m
CROSS APPLY (SELECT PATINDEX('WHERE' + whitespace + '%', MetadataWhereClause) AS WPI,
                    PATINDEX('AND' + whitespace + '%', MetadataWhereClause) AS API,
                    PATINDEX('OR' + whitespace + '%', MetadataWhereClause) AS OPI) PPP
CROSS APPLY (SELECT CASE WHEN WPI > 0 THEN SUBSTRING(MetadataWhereClause, 7, LEN(MetadataWhereClause))
                         WHEN API > 0 THEN SUBSTRING(MetadataWhereClause, 5, LEN(MetadataWhereClause))
                         WHEN OPI > 0 THEN SUBSTRING(MetadataWhereClause, 4, LEN(MetadataWhereClause))
                         ELSE MetadataWhereClause
                    END NMT) AS n
--#endregion

DECLARE @ProcParameters NVARCHAR(MAX) = 'EXEC sp_CompareDBTables
    @SourceDatabase = '''
 + @SourceDatabase + ''',
    @DestinationDatabaseList = '''
 + @DestinationDatabaseList + ''',
    @MetadataWhereClause = '
 + ISNULL('''' + REPLACE(@MetadataWhereClause, '''', '''''') + '''', 'NULL') + '
GO
'

--#region Table Creation and table selects to print for further analysis
SELECT  @SQL = 'RETURN
'
 + @ProcParameters + '/* *********************************** To query results refer to below tables *********************************** */
'
 + Util.dbo.StringConcat(CASE WHEN IsSource = 1 THEN 'SELECT Type, SchemaName, TableName, ObjectName, IndexId, DropScript, CreateScript,
(SELECT 1 AS tag, NULL AS parent, CHAR (13) + CreateScript + CHAR (13) AS [Q!1!Q!CDATA] FOR XML EXPLICIT, Type) as CreateScriptXML
FROM '
 + TableName
                          END + '

'
, '') + Util.dbo.StringConcat(CASE WHEN IsSource = 0
                                    THEN 'SELECT Type, SchemaName, TableName, ObjectName, IndexId, DropScript, CreateScript,
(SELECT 1 AS tag, NULL AS parent, CHAR (13) + CreateScript + CHAR (13) AS [Q!1!Q!CDATA] FOR XML EXPLICIT, Type) as CreateScriptXML
FROM '
 + TableName
                                         + '

SELECT DiffType, SchemaName, TableName, ObjectName, Type, IndexId, LeftScript, RightScript, DropScript,
CASE WHEN LeftScript <> '''' THEN (SELECT 1 AS tag, NULL AS parent, CHAR (13) + LeftScript + CHAR (13) AS [Q!1!Q!CDATA] FOR XML EXPLICIT, Type) END as LeftScriptXML,
CASE WHEN RightScript < >'''' THEN (SELECT 1 AS tag, NULL AS parent, CHAR (13) + RightScript + CHAR (13) AS [Q!1!Q!CDATA] FOR XML EXPLICIT, Type) END as RightScriptXML
FROM '
 + ResultTableName
                               END, '

'
) + '
/* *********************************** To query results refer to above tables *********************************** */
GO
'
,
        @SQLExec = Util.dbo.StringConcat(CASE WHEN IsSource = 1 THEN 'CREATE TABLE ' + TableName + ' (Type varchar(2) NOT NULL,
SchemaName sysname NOT NULL,
TableName sysname NOT NULL,
ObjectName sysname NULL,
IndexId int NOT NULL,
DropScript varchar(MAX) NULL,
CreateScript varchar(MAX) NULL UNIQUE CLUSTERED (SchemaName, TableName, ObjectName, Type))

'

                                         END, '') + Util.dbo.StringConcat(CASE WHEN IsSource = 0 THEN 'CREATE TABLE ' + TableName + ' (Type varchar(2) NOT NULL,
SchemaName sysname NOT NULL,
TableName sysname NOT NULL,
ObjectName sysname NULL,
IndexId int NOT NULL,
DropScript varchar(MAX) NULL,
CreateScript varchar(MAX) NULL UNIQUE CLUSTERED (SchemaName, TableName, ObjectName, Type))

CREATE TABLE '
 + ResultTableName + ' (
DiffType VARCHAR(30) NOT NULL,
SchemaName VARCHAR(256) NOT NULL,
TableName VARCHAR(256) NOT NULL,
ObjectName VARCHAR(256) NULL,
Type VARCHAR(10) NOT NULL,
IndexId INT NOT NULL,
LeftScript VARCHAR(MAX) NULL,
RightScript VARCHAR(MAX) NULL,
DropScript VARCHAR(MAX) NULL
UNIQUE CLUSTERED (SchemaName, TableName, ObjectName, Type, IndexId))'

                                                                          END, '')
FROM    @DatabaseList

EXEC Util.dbo.PrintLargeText
    @SQL

EXEC(@SQLExec)
--#endregion

--#region Create temp exec comparison tables
INSERT  Util.SE.SQLExecutionGroup
        (Description, UseTransaction)
VALUES  ('CompareDBTables', 0)

DECLARE @ExecutionGroupId INT = SCOPE_IDENTITY()
SET CONTEXT_INFO @ExecutionGroupId

INSERT  Util.SE.SQLExecution
        (ExecutionGroupId,
         Description,
         DatabaseName,
         CommandText)
        SELECT  @ExecutionGroupId AS ExecutionGroupId,
                @FilePrefix + ' Step 1 ' + SERVERNAME + '.' + DatabaseName AS Description,
                CASE WHEN SERVERNAME = @@SERVERNAME THEN DatabaseName
                     ELSE DB_NAME()
                END AS DatabaseName,
                CommandText
        FROM    @DatabaseList
        CROSS APPLY (SELECT 'INSERT ' + TableName + ' WITH (TABLOCK) (Type, SchemaName, TableName, ObjectName, IndexId, DropScript, CreateScript)
SELECT Type, SchemaName, TableName, ObjectName, IndexId, DropScript, CreateScript
'
 + CASE WHEN SERVERNAME = @@SERVERNAME THEN 'FROM Metadata.TableScripts (NOLOCK)
'
 + @WhereClause
         ELSE 'FROM OPENROWSET(''SQLNCLI'', ''Server=' + SERVERNAME + ';Connect Timeout=3;UID=Metadata;PWD=dorot@6132;'',
''SELECT Type, SchemaName, TableName, ObjectName, IndexId, DropScript, CreateScript FROM '
 + DatabaseName + '.Metadata.TableScripts (NOLOCK)
'
 + REPLACE(@WhereClause, '''', '''''') + ''') AS a'
    END AS CommandText) s

EXEC Util.SE.SQLExecutionWait
    @ExecutionGroupId = @ExecutionGroupId,
    @PrintError = 1

IF EXISTS ( SELECT  *
            FROM    Util.SE.SQLExecutionGetGroup(@ExecutionGroupId)
            WHERE   ISNULL(Status, '') <> 'Completed' )
    BEGIN
        SELECT  *
        FROM    Util.SE.SQLExecutionGetGroup(@ExecutionGroupId)
        RETURN 30
    END
--#endregion
--#region Compare and insert into comparison tables
IF OBJECT_ID('tempdb..#step2') IS NOT NULL
    DROP TABLE #step2

SELECT  @FilePrefix + ' Step 2 ' + s.SERVERNAME + '.' + s.DatabaseName + ' vs ' + t.SERVERNAME + '.' + t.DatabaseName AS Description,
        NoChangeStr,
        CommandText
INTO    #step2
FROM    @DatabaseList t
INNER JOIN @DatabaseList s ON s.IsSource = 1
                              AND t.IsSource = 0
CROSS APPLY (SELECT '---- CompareDBTables ' + s.SERVERNAME + '.' + s.DatabaseName + ' vs ' + t.SERVERNAME + '.' + t.DatabaseName
                    + ' NO CHANGES DETECTED !!! ----' AS NoChangeStr) ns
CROSS APPLY (SELECT CASE WHEN @CompCount > 1 THEN 'DECLARE @SQL VARCHAR(MAX)
'
                        ELSE ''
                    END + 'INSERT ' + t.ResultTableName
                    + ' WITH (TABLOCK) ([DiffType], [SchemaName], [TableName], [ObjectName], [Type], [IndexId], [LeftScript], [RightScript], [DropScript])
SELECT  DiffType,
        ISNULL(l.SchemaName, r.SchemaName) AS SchemaName,
        ISNULL(l.TableName, r.TableName) AS TableName,
        ISNULL(l.ObjectName, r.ObjectName) AS ObjectName,
        ISNULL(l.Type, r.Type) AS Type,
        ISNULL(l.indexid, r.indexid) AS IndexId,
        l.CreateScript AS LeftScript,
        r.CreateScript AS RightScript,
        CASE WHEN DiffType = ''DROP'' THEN r.DropScript
        END AS DropScript
FROM    '
 + s.TableName + ' l (NOLOCK)
FULL OUTER JOIN '
 + t.TableName + ' r (NOLOCK) ON l.SchemaName = r.SchemaName
                                          AND l.TableName = r.TableName
                                          AND ISNULL(l.ObjectName, '''') = ISNULL(r.ObjectName, '''')
                                          AND l.Type = r.Type
                                          AND ISNULL(l.indexid, 0) = ISNULL(r.indexid, 0)
CROSS APPLY (SELECT CASE WHEN l.SchemaName IS NULL THEN ''DROP''
                         WHEN r.SchemaName IS NULL THEN ''CREATE''
                         WHEN l.CreateScript <> r.CreateScript THEN ''DIFF''
                    END AS DiffType) df
WHERE   DiffType IS NOT NULL

SELECT @SQL  =  ''RETURN
'
 + REPLACE(@ProcParameters, '''', '''''') + '
USE ['
 + t.DatabaseName + '] -- ServerName: ' + t.SERVERNAME + '
GO
/* ---------------- '' + CAST(COUNT(*) AS VARCHAR) + '' Table(s) different ---------------- */
-- DifferenceType = CREATE: Does not exists on right, DROP: Does not exists on left, DIFF: Left Right Different

'' + Util.dbo.StringConcat(DiffScript, '''')
FROM(
SELECT ''/* -------- Table: ['' + SchemaName + ''].['' + TableName + ''], '' + CAST(COUNT(*) AS VARCHAR) + '' Difference(s) -------- */
'' + Util.dbo.StringConcat(DiffScript + ''
GO
'', '''') AS DiffScript

FROM
(SELECT  TOP 999999999 SchemaName, TableName,
''/* ---- DifferenceType: '' + DiffType + '', ObjectType: '' + Type + '' ---- */
'' + CASE DiffType WHEN ''CREATE'' THEN LeftScript WHEN ''DROP'' THEN DropScript WHEN ''DIFF'' THEN ''RETURN
-- LEFT --
'' + LeftScript + ''
-- RIGHT --
'' + RightScript END AS DiffScript
FROM '
 + t.ResultTableName
                    + '
CROSS APPLY(SELECT CASE Type when ''U'' THEN 1 WHEN ''PK'' THEN 2 WHEN ''UQ'' THEN 3 WHEN ''I'' THEN 4 WHEN ''D'' THEN 5 WHEN ''C'' THEN 6 WHEN ''F'' THEN 7 ELSE 10 END AS OrderId) b
ORDER BY SchemaName, TableName, OrderId, IndexId)k
GROUP BY SchemaName, TableName)k

SET @SQL = ISNULL(@SQL, '''')
'
 + CASE WHEN @SaveToFile = 1 THEN 'DECLARE @I INT
SELECT  @I = COUNT(*)
FROM    Util.FS.AppendAllTextToFile('''
 + @Directory + t.FileName + ''', @SQL, 1)

SET @SQL = CASE WHEN @SQL ='''' THEN '''
 + NoChangeStr + ''' ELSE @SQL END

'
        ELSE ''
    END + CASE WHEN @CompCount = 1 THEN 'SELECT DiffType, SchemaName, TableName, ObjectName, Type, IndexId FROM ' + t.ResultTableName
               ELSE ''
          END AS CommandText) k
--#endregion

--#region Create Solution
IF @SaveToFile = 1
    BEGIN
        SELECT  @ProjectFileName = @Directory + @FilePrefix + @Postfix + '.ssmssqlproj',
                @ProjectFileContents = '
+
 @FilePrefix + @Postfix
                + '">
  
    
      
'
 + Util.dbo.StringConcat(DISTINCT '         + SERVERNAME + ':' + @UserName + '">
          '
 + @Created + '
          SQL
          '
 + SERVERNAME + '
          
          Windows Authentication
          Corestore
          3
          0
          NotSpecified
          
        '
, '
'
) + '
      
    
    
      
'
 + Util.dbo.StringConcat(CASE WHEN IsSource = 0 THEN '         + FILENAME + '">
          '
 + @NewID + ':' + SERVERNAME + ':True
          '
 + SERVERNAME + '
          
          '
 + FILENAME + ''
                          END + '
        '
, '
'
) + '
      
    
    
      
    
  
'

        FROM    @DatabaseList

        SELECT  @IntVal = COUNT(*)
        FROM    Util.FS.AppendAllTextToFile(@ProjectFileName, @ProjectFileContents, 1)
    END
--#endregion

--#region Do multi comparison
IF @CompCount > 1
    BEGIN
        INSERT  Util.SE.SQLExecutionGroup
                (Description, UseTransaction)
        VALUES  ('CompareDBTables', 0)

        SET @ExecutionGroupId = SCOPE_IDENTITY()
        SET CONTEXT_INFO @ExecutionGroupId

        INSERT  Util.SE.SQLExecution
                (ExecutionGroupId,
                 Description,
                 DatabaseName,
                 CommandText)
                SELECT  @ExecutionGroupId AS ExecutionGroupId,
                        Description,
                        DB_NAME() AS DatabaseName,
                        CommandText
                FROM    #step2 t
        EXEC Util.SE.SQLExecutionWait
            @ExecutionGroupId = @ExecutionGroupId,
            @PrintError = 1
        PRINT '-- ProcessStart: ' + CAST(@ProcessStart AS VARCHAR) + ', Duration: ' + CAST(DATEDIFF(SECOND, @ProcessStart, GETDATE()) AS VARCHAR) + '
GO'

        IF EXISTS ( SELECT  *
                    FROM    Util.SE.SQLExecutionGetGroup(@ExecutionGroupId)
                    WHERE   ISNULL(Status, '') <> 'Completed' )
            BEGIN
                SELECT  *
                FROM    Util.SE.SQLExecutionGetGroup(@ExecutionGroupId)
                RETURN 30
            END
    END
--#endregion
--#region Do single comparison
ELSE
    IF @CompCount = 1
        BEGIN

            SELECT  @SQLExec = Commandtext,
                    @NCD = NoChangeStr
            FROM    #step2
            EXEC sp_executesql
                @SQLExec,
                N'@SQL VARCHAR(MAX) OUTPUT',
                @SQL OUTPUT
            SET @IntVal = @@ROWCOUNT
            PRINT '-- ProcessStart: ' + CAST(@ProcessStart AS VARCHAR) + ', Duration: ' + CAST(DATEDIFF(SECOND, @ProcessStart, GETDATE()) AS VARCHAR) + '
GO'

            IF @IntVal = 0
                BEGIN
                    PRINT @NCD
                    RETURN
                END
            IF @PrintReport = 1
                EXEC Util.dbo.PrintLargeText
                    @SQL
        END
--#endregion

IF @SaveToFile = 1
    SELECT  d.FileName,
            f.SIZE,
            f.SizeMB,
            f.CreateDate
    FROM    (SELECT @Directory + FileName AS FileName
             FROM   @DatabaseList d
             WHERE  IsSource = 0
             UNION ALL
             SELECT @ProjectFileName
             WHERE  @ProjectFileName IS NOT NULL) d
    CROSS APPLY Util.FS.GetFileInfo(d.FileName) f

IF @recipients <> ''
    BEGIN
        BEGIN TRY

            SELECT  @SQL = Util.dbo.StringConcat(l.FileName, '
'
)
            FROM    (SELECT @Directory + FileName AS FileName
                     FROM   @DatabaseList
                     WHERE  IsSource = 0
                     UNION ALL
                     SELECT @ProjectFileName AS FILENAME
                     WHERE  @ProjectFileName IS NOT NULL) l
            IF @SQL <> ''
                BEGIN
                    SELECT  @ListFile = @Directory + 'List' + @Postfix + '.txt',
                            @ZipFile = @Directory + @FilePrefix + @Postfix + '.zip'


                    BEGIN
                        SELECT  @IntVal = COUNT(*)
                        FROM    Util.FS.AppendAllTextToFile(@ListFile, @SQL, 1)

                        SET @cmd = '"C:\Program Files\7-Zip\7z.exe" a -tzip ' + @ZipFile + ' @' + @ListFile

                        EXEC xp_cmdshell
                            @cmd,
                            no_output

                        EXEC msdb.dbo.sp_send_dbmail
                            @recipients = @recipients,
                            @subject = 'CompareDBTables',
                            @body = @ProcParameters,
                            @file_attachments = @ZipFile
                    END
                END
        END TRY
        BEGIN CATCH
            SELECT  @SQL = Util.dbo.StringConcat(k.FileName, ';')
            FROM    (SELECT @Directory + FileName AS FileName
                     FROM   @DatabaseList
                     WHERE  IsSource = 0
                     UNION ALL
                     SELECT @ProjectFileName AS FILENAME
                     WHERE  @ProjectFileName IS NOT NULL) k
            IF @SQL <> ''
                EXEC msdb.dbo.sp_send_dbmail
                    @recipients = @recipients,
                    @subject = 'CompareDBTables',
                    @body = @ProcParameters,
                    @file_attachments = @SQL
        END CATCH
    END
GO
EXEC sys.sp_ms_marksystemobject sp_CompareDBTables
GO

Description for System Stored Procedure: master.dbo.sp_CompareDBTables

Todo
Site Map | Printable View | © 2008 - 2012 NuRoN Consulting, INC | Powered by mojoPortal | HTML 5 | CSS | Original design by Andreas Viklund
Share This Using Popular Bookmarking Services