使用java和Server 2008,我需要比较两个表的内容,需要记住的是,它们位于不同的服务器上,因此我有一个连接到第一个服务器(让我们称之为conn1)和一个连接到第二个服务器(让我们称之为conn2)。我将表复制到临时表中,然后尝试使用use操作符来比较临时表。
在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吗?
你知道我该怎么做吗?
谢谢。
发布于 2014-05-28 13:28:01
你想做的事毫无意义。记住,SQL是在Server上执行的,而不是在Java中执行的。因此,如果两个SQL服务器不能相互看到,则不能跨SQL服务器执行无法相互查看的查询。
一种解决方案是在这两个服务器上执行查询,并将数据输入到java ResultSet中,然后在Java中处理数据。
或者,将所有数据复制到一个Server,并在该服务器上执行除其他查询
发布于 2014-05-28 13:18:33
如果SQL服务器可以“看到”对方,那么您可以通过一个连接完成整个过程:
"SELECT * FROM Server1.database.schema.FACTOR
EXCEPT
SELECT * FROM Server2.database.schema.Factor"我建议列出列名,以防将来发生变化。
发布于 2014-05-28 13:26:01
普通的临时表只对它们在其中使用的连接可见。由'#‘而不是’#‘表示的全局临时表对多个连接是可见的,但是当创建它们的连接关闭时就消失了。
最好在使用链接服务器的存储过程中这样做。例如:
CREATE PROCEDURE uspCompareTables
AS
BEGIN
select * from Factor
EXCEPT
select * from OTHER_SERVER.dbo.Factor
END然后您就可以从您的java应用程序调用它。用正常的..。
exec uspCompareTableshttps://stackoverflow.com/questions/23912600
复制相似问题