我打算髮布兩個答案的組合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