2013-07-15 111 views
0

我有一張表,我用它讀取變量SqlCommand,在其上執行ExecuteReader一個返回的SqlDataReader對象我正在計算每一行,我從哪裏開始操作字符串在插入新DB時使用變量SqlCommand並執行ExecuteNonQuery()從數據庫獲取行並將它們插入另一個

我的問題是,如果有更優雅/高效的方式來做到這一點?就像在一個命令中獲取所有行一樣,一次插入所有行或者其他任何比當前流程更好的行。

UPDATE 一個重要的事情是這些表位於不同服務器上的不同數據庫中。

+0

完全取決於您的需求。聽起來你可能會在一個大的SQL語句('Insert Something select Foo from SomethingElse')中做到這一點,在這種情況下,如果你在一個proc中編寫它,並且只是稱爲proc,它會更快地執行。但是,對於數據的處理方式,你會失去一點控制權。還取決於你正在使用多少記錄,你實際需要它運行多快,等等。 –

+0

@JoeEnos正如我在更新中所述,表或在不同的服務器上,所以我不能只做一個大的'SqlCommand'因爲它們與不同的連接相關聯。 – coredump

+0

如果您右鍵單擊SSMS中的數據庫並選擇「任務 - >導入」,則可以選擇SQL服務器/數據庫源和目標。 c#是一種手段和結束還是要求? – James

回答

1

你可以寫它看起來像

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 
0

存儲過程或SqlCommand如果操作是你需要C#.NET的,那麼你有兩個選擇

1)建立和插入多個行使用的語法:
values(),()
您可以在單個語句中插入多於一行 - 這將使它不那麼健談
最好保持總值上課小於1000爲每個插入

2)使用TVP(表值參數)

在可以執行在TSQL操縱然後只是的插入件。
或者使用CLR,以便在插入中使用C#。

通過鏈接服務器,您可以遍歷服務器。
您只需在插入/選擇中使用4部分名稱。

2

我會建議:一步試一試。

INSERT INTO yourDataBase1.yourTable1 VALUES (Column1, Column2, ...) 
SELECT Column1, Column2, ... FROM yourDataBase2.yourTable1 

優點:以太網

  • 較少的流量
  • 快速與其它方案相比(如存儲過程)

我會做這個交易爲基礎的在C#應用程序(傳輸/回滾)。所以如果出現問題,它不會只插入一半的行。

0

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