C# 使用c的1个sql和2个不同的sqlconnections

C# 使用c的1个sql和2个不同的sqlconnections,c#,sql-server,C#,Sql Server,我有两个不同的连接,分别位于不同的sql Server、源服务器和目标服务器上。 我想比较两台服务器中存在的表,并将目标服务器表与源服务器表对齐 SqlConnection src = (DataBaseConnection.GetSqlConnection()); SqlConnection trg = new SqlConnection(Properties.Settings.Default.IDCConnectionDEV); src.Open(); trg.Open(); SqlC

我有两个不同的连接,分别位于不同的sql Server、源服务器和目标服务器上。 我想比较两台服务器中存在的表,并将目标服务器表与源服务器表对齐

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查询。

您将无法跨两个不同的数据表运行sql语句,因为它们位于不同的连接上

您可以在一台或另一台服务器上创建链接服务器,然后在使用SQL连接到另一台服务器的一台服务器上运行查询。 您可以使用SQL以外的其他方法执行连接客户端。 < >执行连接客户端时,如果这些表大,请考虑使用合并连接来最小化客户端内存需求。这将是向两个SELECT语句添加ORDER BY子句,以按主键对它们进行排序,如果没有主键,则按某个唯一键对它们进行排序。然后,使用and==比较来检查记录是否在一个或另一个中,通过循环一个边并与另一个的当前记录进行比较。然后,您可以确定记录是否在源中而不是目标中,目标中是否有记录而不是源中,或者记录是否在两者中都存在。在这种情况下,考虑使用IDATALADER而不是DATABATE,以防止在表大的情况下将两个表加载到内存中。 或者,您可以使用散列连接,这可能是linq在表不是很大并且客户端有大量RAM的情况下解决它的方式。这将是将一方的主键/唯一键加载到字典中,然后测试另一方的每条记录,看看它是否在字典中。编码更容易,速度可能更快,但需要更多的内存使用。您可以使用IDataReader而不是DataTable来保存客户端内存,但是您必须在字典的内存中至少有一个连接的完整部分


最后,您可以使用Linq查询以类似SQL的方式执行客户端连接。这将是最小的代码量。您必须将其保留在DataTable中,Linq可能会在封面下使用字典或哈希集,因此内存中会有3个表的副本,以便执行此操作。

您可以在SqlCommand中使用链接服务器,然后查看此示例,使用左或右连接来获得两个表之间的差异,请参阅示例:

如果服务器可以看到彼此使用sp_addlinkedserver将一台服务器链接到另一台服务器,则该服务器可以直接查询第二台服务器。从otherserver.dbname.dbo.someTable中选择*或按原样读取数据,然后使用linq筛选数据