Sql 使用动态数据库比较两个表
我在2个不同的数据库上有2个表(相同的名称) 我想比较一下这些表格,这是我的程序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
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感谢您的准确回答