0

I have 2 table (same name) on 2 different database

MY TABLES

I want compare these table, this is my procedure

ALTER PROCEDURE COUNTCOLUMN 
    @TABLENAME NVARCHAR(MAX), 
    @DATABASENAME1 NVARCHAR(MAX),
    @DATABASENAME2 NVARCHAR(MAX)
AS  
BEGIN
    DECLARE @COLNAME   NVARCHAR(MAX)
    DECLARE @ROWCOUNT  INT
    DECLARE @ROWCOUNT2 INT
    DECLARE @NUMB1     INT 
    DECLARE @NUMB2     INT

    DECLARE @SQLQUERY  NVARCHAR(MAX)
    DECLARE @SQLQUERY2 NVARCHAR(MAX)
    DECLARE @SQLQUERY3 NVARCHAR(MAX)
    DECLARE @SQLQUERY4 NVARCHAR(MAX)
    DECLARE @SQLQUERY5 NVARCHAR(MAX)
    DECLARE @SQLQUERY6 NVARCHAR(MAX)

    SET @SQLQUERY  = 'SELECT @NUMBER = COUNT(*) FROM information_schema.columns  WHERE table_name =  '+N'@TESTTB'+''
    SET @SQLQUERY2  = 'USE ' + @DATABASENAME1 
    SET @SQLQUERY3  = 'USE ' + @DATABASENAME2

    EXECUTE sp_executesql @SQLQUERY2

    EXECUTE sp_executesql @SQLQUERY, N'@TESTTB NVARCHAR(MAX), @NUMBER INT OUTPUT',@TESTTB = @TABLENAME ,@NUMBER = @NUMB1 OUTPUT

    EXECUTE sp_executesql @SQLQUERY3
    EXECUTE sp_executesql @SQLQUERY, N'@TESTTB NVARCHAR(MAX), @NUMBER INT OUTPUT',@TESTTB = @TABLENAME ,@NUMBER = @NUMB2 OUTPUT

    IF(@NUMB1 <= @NUMB2)
    BEGIN
        DECLARE @NUMB INT
        SET @NUMB = 1

        WHILE (@NUMB <= @NUMB1)
        BEGIN
            IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES  
                        WHERE TABLE_NAME = 'TEMP1'))
            BEGIN
                DROP TABLE TEMP1
            END

            IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES  
                        WHERE TABLE_NAME = 'TEMP2'))
            BEGIN
                DROP TABLE TEMP2
            END
            ELSE
            BEGIN
                SET @SQLQUERY4 = 'SELECT @COL_NAME = COL_NAME(OBJECT_ID(@TABLENAME), @NUMB)'            

                EXECUTE sp_executesql @SQLQUERY2
                EXECUTE sp_executesql @SQLQUERY4, N'@TABLENAME NVARCHAR(MAX),@NUMB INT, @COL_NAME NVARCHAR(MAX) OUTPUT', @TABLENAME = @TABLENAME,@NUMB=@NUMB, @COL_NAME = @COLNAME OUTPUT

                SET @SQLQUERY5 = 'SELECT '+ @COLNAME + ' INTO TEST_DB..TEMP1 FROM ' + @TABLENAME 

                EXECUTE sp_executesql @SQLQUERY2
                EXECUTE sp_executesql @SQLQUERY5

                EXECUTE sp_executesql @SQLQUERY3                   
                EXECUTE sp_executesql @SQLQUERY4, N'@TABLENAME NVARCHAR(MAX),@NUMB INT, @COL_NAME NVARCHAR(MAX) OUTPUT', @TABLENAME = @TABLENAME,@NUMB=@NUMB, @COL_NAME = @COLNAME OUTPUT

                SET @SQLQUERY6 = 'SELECT ' + @COLNAME +' INTO TEST_DB..TEMP2 FROM '+ @TABLENAME 

                EXECUTE sp_executesql @SQLQUERY3
                EXECUTE sp_executesql @SQLQUERY6

                SELECT @ROWCOUNT  = COUNT(*) FROM TEMP1 
                SELECT @ROWCOUNT2 = COUNT(*) FROM TEMP2

                IF(@ROWCOUNT != @ROWCOUNT2)
                BEGIN
                    PRINT N'NUMBER OF ROWS ARE NOT EQUAL';
                    BREAK
                END
                ELSE IF (@NUMB > @NUMB1)
                    BREAK
                ELSE
                BEGIN        
                    SELECT * FROM TEST_DB..TEMP1 
                    EXCEPT 
                    SELECT * FROM TEST_DB..TEMP2

                    SET @NUMB = @NUMB + 1;
                    CONTINUE       
                END
           END
     END
END
END

It should be like this TEMP1 <--TEST_DB..TESTTABLE, TEMP2 <--TEST_DB2..TESTTABLE

But TEMP1 , TEMP2 always have the same values as TESTTABLE from the first database (TEST_DB )

MY RESULT

EXPECTED RESULT

It seem like I can't switch between two databases in procedure so I try to run it separate but still not work

Gordon Linoff
  • 1,242,037
  • 58
  • 646
  • 786
Hau Le
  • 25
  • 1
  • 7
  • 1
    Procedural and dynamic code is **highly vendor-specific** - so please add a tag to specify whether you're using `mysql`, `postgresql`, `sql-server`, `oracle` or `db2` - or something else entirely. – marc_s Jun 23 '18 at 08:59
  • What should be the result of comparison? – Braca Jun 23 '18 at 09:03
  • The scope of the dynamic `USE` statement is only for that batch. The database context reverts back after the statement completes. You could include the `USE` in the same batch as the dynamic query. – Dan Guzman Jun 23 '18 at 10:12
  • @DanGuzman thank you for the precise answer – Hau Le Jun 23 '18 at 12:07

0 Answers0