我打算发布两个答案的组合Jay Patel是这样做的最好方法,因为您希望使用不同的服务器和数据库。
但是将它包装在try catch和transaction中将是最好的想法,所以我会采用Jay Patel的Method并包装它,所以无论出于何种原因它都会出现故障。
BEGIN TRAN -- START THE TRANSACTION BUT DONT PHSICALLY PUT THE ROWS IN THE DATABASE UNTIL COMMIT
BEGIN TRY
INSERT INTO DB1.dbo.TestTable(FirstName, LastName)
SELECT RemoteTable.FirstName, RemoteTable.LastName FROM
OPENROWSET('SQLOLEDB',
'Server=x.x.x.x;Trusted_Connection=yes;user_id=xxxx;password=xxxx',
'SELECT FirstName, LastName FROM DB2.dbo.TestTable') as RemoteTable
END TRY
BEGIN CATCH
ROLLBACK -- IF THE INSERT FAILS DONT INSERT ANYROWS INTO THE DATABASE
END CATCH
COMMIT --USED FOR COMMITING THE ROWS TO THE DATABASE THEY ARE NOT ACTUALLY IN THE DATABASE UNTIL THIS HAS BEEN COMMITED
完全取决于您的需求。听起来你可能会在一个大的SQL语句('Insert Something select Foo from SomethingElse')中做到这一点,在这种情况下,如果你在一个proc中编写它,并且只是称为proc,它会更快地执行。但是,对于数据的处理方式,你会失去一点控制权。还取决于你正在使用多少记录,你实际需要它运行多快,等等。 –
@JoeEnos正如我在更新中所述,表或在不同的服务器上,所以我不能只做一个大的'SqlCommand'因为它们与不同的连接相关联。 – coredump
如果您右键单击SSMS中的数据库并选择“任务 - >导入”,则可以选择SQL服务器/数据库源和目标。 c#是一种手段和结束还是要求? – James