1. 使用C#同时使用两个不同的SQL连接执行SQL查询

3

我有两个不同的连接位于不同的SQL服务器上,源服务器和目标服务器。 我要比较存在于两个服务器中的一个表,并将目标服务器的表与源服务器对齐。

SqlConnection src = (DataBaseConnection.GetSqlConnection());

SqlConnection trg = new SqlConnection(Properties.Settings.Default.IDCConnectionDEV);

src.Open();
trg.Open();

SqlCommand source = new SqlCommand("SELECT * FROM Source table", src);
SqlCommand traget = new SqlCommand("SELECT * FROM Target Table", trg);

SqlDataReader drsrc = source.ExecuteReader();
SqlDataReader drtrg = traget.ExecuteReader();

DataTable tbl1 = new DataTable();
tbl1.Load(drsrc);

DataTable tbl2 = new DataTable();
tbl2.Load(drtrg);

现在我的问题是如何运行以下查询:
(select * from Source table) except (select * from Target table)

或者使用来自两个连接的表的任何其他SQL查询。


2
如果服务器可以相互看到,可以使用sp_addlinkedserver将一个服务器链接到另一个服务器,然后该服务器就可以直接查询第二个服务器(例如:select * from otherserver.dbname.dbo.sometable)。 - Alex K.
1
或者像平常一样读取数据,然后使用 LINQ 过滤您的数据。 - Pikoh
2个回答

0

由于它们位于不同的连接上,您将无法在两个不同的数据表之间运行SQL语句。

  1. 您可以在其中一个服务器上创建链接服务器,然后在一个服务器上运行查询,该查询使用SQL连接到另一个服务器。
  2. 您可以在客户端使用除SQL之外的其他内容执行联接。

要在客户端执行联接,请考虑使用合并联接来最小化客户端内存需求(如果这些表很大)。这将向两个SELECT语句添加ORDER BY子句,以通过主键或某个唯一键对它们进行排序。然后,您将循环遍历一侧,并使用<、>和==比较来比较另一侧的当前记录,以检查记录是否在其中一个或另一个中。然后,您可以确定记录是否存在于源中而不在目标中,如果目标中有记录但源中没有,则存在记录,或者如果记录存在于两者中。在这种情况下,考虑使用IDataReader而不是DataTable,以防止在内存中加载两个表(如果表确实很大)。

或者,如果表不是很大且客户端有足够的RAM,您可以使用哈希连接(这可能是linq如何解决它的方式)。 这将加载一侧的主/唯一键到Dictionary中,然后测试另一侧的每个记录,以查看它是否在Dictionary中。 编码更容易,速度可能更快,但需要更多的内存使用。 您可以使用IDataReader而不是DataTable来保存客户端内存,但您必须将连接的至少一侧完全存储在内存中(在Dictionary中)

最后,您可以使用Linq查询以类似SQL的方式执行客户端连接。 这将是最少量的代码。 您必须将其保留在DataTable中,并且Linq可能会在内部使用DictionaryHashset,因此您将在内存中拥有3个表的副本才能使其正常工作。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接