比较不同服务器上的表

时间:2014-05-28 13:11:52

标签: java sql-server

使用java和SQL Server 2008,我需要比较两个表的内容,要记住的是它们在不同的服务器上,所以我连接到第一个服务器(让我们称之为conn1)和连接到第二个服务器(让我们称之为conn2)。 我将表复制到临时表中,然后尝试使用EXCEPT运算符来比较临时表。

尝试在java中执行此操作的一个非常基本的示例:

String s1 = "select * into #temp1 from FACTOR";
String s2 = "select * into #temp2 from FACTOR'";
String s3 = "SELECT * FROM #temp1 EXCEPT SELECT * FROM #temp2";

Statement st = null;
ResultSet rs = null;
st = conn1.createStatement();
st.execute(s1);

Statement st1 = null;
ResultSet rs1 = null;
st1 = conn2.createStatement();
st1.execute(s2);

Statement st3 = null;
ResultSet rs3 = null;
st3 = conn2.createStatement();
rs3 = st3.executeQuery(s3);

我在上面的代码段的最后一行收到以下错误:

Stack trace:java.sql.SQLException: Invalid object name '#temp1'.

是不是因为我使用了与不同服务器的两个连接,conn2看不到#temp1?

我有什么想法可以实现我想要做的事情?

感谢。

3 个答案:

答案 0 :(得分:0)

如果SQL Server可以“看到”彼此,那么您可以通过一个连接完成整个事情:

"SELECT * FROM Server1.database.schema.FACTOR
EXCEPT
SELECT * FROM Server2.database.schema.Factor"

我建议列出列名,以防它们将来发生变化。

答案 1 :(得分:0)

普通临时表仅对其使用的连接可见。由' ##'表示的全局临时表而不是'#'对于多个连接是可见的,但在创建它们的连接关闭时会消失。

在使用链接服务器的存储过程中,这样做会更好。 e.g。

CREATE PROCEDURE uspCompareTables
AS
BEGIN
     select * from Factor
     EXCEPT
     select * from OTHER_SERVER.dbo.Factor
END

然后你可以从你的java应用程序中调用它。使用正常......

exec uspCompareTables

答案 2 :(得分:0)

你想要做的事情没有意义。请记住,SQL在SQL Server上执行,而不是在Java中执行。因此,如果2个SQL Server无法看到对方,则无法跨越无法看到对方的SQL Server执行查询。

一种解决方案是在两台服务器上执行查询,并将数据导入Java ResultSet,然后在java中处理数据。

或者,将所有数据复制到一个SQL Server,并在该服务器上执行EXCEPT查询