使用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?
我有什么想法可以实现我想要做的事情?
感谢。
答案 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查询