Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用动态数据库比较两个表_Sql_Sql Server_Stored Procedures_Compare_Dynamicquery - Fatal编程技术网

Sql 使用动态数据库比较两个表

Sql 使用动态数据库比较两个表,sql,sql-server,stored-procedures,compare,dynamicquery,Sql,Sql Server,Stored Procedures,Compare,Dynamicquery,我在2个不同的数据库上有2个表(相同的名称) 我想比较一下这些表格,这是我的程序 ALTER PROCEDURE COUNTCOLUMN @TABLENAME NVARCHAR(MAX), @DATABASENAME1 NVARCHAR(MAX), @DATABASENAME2 NVARCHAR(MAX) AS BEGIN DECLARE @COLNAME NVARCHAR(MAX) DECLARE @ROWCOUNT INT DE

我在2个不同的数据库上有2个表(相同的名称)

我想比较一下这些表格,这是我的程序

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
ALTER PROCEDURE COUNTCOLUMN
@表名NVARCHAR(最大值),
@数据库名称1 NVARCHAR(最大值),
@数据库名称2 NVARCHAR(最大值)
作为
开始
声明@COLNAME NVARCHAR(最大值)
声明@rowcountint
声明@ROWCOUNT2 INT
声明@numb1int
声明@numb2int
声明@SQLQUERY NVARCHAR(最大值)
声明@SQLQUERY2 NVARCHAR(最大值)
声明@SQLQUERY3 NVARCHAR(最大值)
声明@SQLQUERY4 NVARCHAR(最大值)
声明@SQLQUERY5 NVARCHAR(最大值)
声明@SQLQUERY6 NVARCHAR(最大值)
SET@SQLQUERY='从信息_schema.columns中选择@NUMBER=COUNT(*),其中table_name='+N'@TESTTB'+''
SET@SQLQUERY2='USE'+@DATABASENAME1
SET@SQLQUERY3='USE'+@DATABASENAME2
执行sp_executesql@SQLQUERY2
执行sp_executesql@SQLQUERY,N'@TESTTB NVARCHAR(MAX),@NUMBER INT-OUTPUT',@TESTTB=@TABLENAME,@NUMBER=@NUMB1-OUTPUT
执行sp_executesql@SQLQUERY3
执行sp_executesql@SQLQUERY,N'@TESTTB NVARCHAR(MAX),@NUMBER INT OUTPUT',@TESTTB=@TABLENAME,@NUMBER=@NUMB2 OUTPUT

如果(@NUMB1过程和动态代码是高度特定于供应商的-因此请添加一个标记,以指定您使用的是
mysql
postgresql
sql server
oracle
db2
,还是其他完全不同的代码。比较的结果应该是什么?动态
USE
语句的范围是仅适用于该批处理。语句完成后,数据库上下文将恢复。您可以将
USE
与动态查询包含在同一批处理中。@DanGuzman感谢您的准确回答