2017-06-28 256 views
1

我有一個Web應用程序的SQL服務器數據庫,我的要求是從一個源數據庫讀取2-3個表數據並將數據插入到目標數據庫中。我的輸入將是一個名稱和一個ID,基於此我必須從源數據庫中讀取數據,並且必須驗證相似的名稱是否已存在於目標數據庫中。我必須通過C#Windows應用程序或Web應用程序來完成此操作。將SQL Server數據從一個數據庫導出到另一個數據庫

到目前爲止,在我的研究中,人們推薦使用SqlBulkCopy或SSIS包,我嘗試使用以下代碼傳輸一個表數據。

 using (SqlConnection connSource = new SqlConnection(csSource)) 
     using (SqlCommand cmd = connSource.CreateCommand()) 
     using (SqlBulkCopy bcp = new SqlBulkCopy(csDest)) 
     { 
      bcp.DestinationTableName = "SomeTable"; 
      cmd.CommandText = "myproc"; 
      cmd.CommandType = CommandType.StoredProcedure; 
      connSource.Open(); 
      using (SqlDataReader reader = cmd.ExecuteReader()) 
      { 
       bcp.WriteToServer(reader); 
      } 
     } 

我現在面臨的問題是,我必須複製2點表的數據,是根據表1,表2值像ID(主鍵)的變化,我在SqlDataReader的更新這一點,所以爲了在目標數據庫中獲得這個新ID,我必須先插入一個表數據,然後獲取ID,然後在我的reader對象中更新此ID,然後再執行另一個SqlBulkCopy,這看起來不像是理想的方式做這個,有沒有其他的做這個?

+1

您可以指定兩個數據庫是否在同一個SQL實例上? –

+0

沒有不在同一個實例 – user1890098

回答

0

在源SQL實例我將創建的鏈接服務器引用目的地/目標SQL實例,然後我將因此創建源數據庫中的存儲過程:然後

USE SourceDatabase 
GO 
CREATE PROCEDURE dbo.ExportSomething 
@param1 DataType1, 
@param2 DataType2, ... 
AS 
BEGIN 

INSERT LinkedServer.DestinationDatabase.dbo.TargetTable 
SELECT ... 
FROM dbo.Table1 INNER JOIN dbo.Table2 .... 
WHERE Col1 = @param1 AND/OR ... 

END 
GO 

,最後一步是調用這客戶端應用程序的存儲過程

+0

我的要求是,我會從用戶獲取目標SQL Server連接細節,數據庫名稱可能是任何東西,所以我發現我可以使用sp_addlinkedserver以編程方式創建鏈接服務器,所以在你的回答中,我可以根據用戶輸入動態更改LinkedServer.DestinationDatabase部分? – user1890098

+0

您可以使用sp_add * /創建一個鏈接的靜態,像這樣/ *只有當這個存儲過程可以被一次使用一次就可以執行。如果兩個用戶同時執行這個存儲過程*,那麼這個解決方案並不是最優的。相反,你可以在dinamic sql(ODS函數)中使用OPENDATASOURCE()函數([ref](https://docs.microsoft.com/zh-cn/sql/t-sql/functions/opendatasource-transact-sql))不接受變量 - 例如@connection_string - 作爲參數)。 –

0

如果上述解決方案對您沒有幫助,那麼您還可以嘗試使用SQL Database Recovery軟件,該軟件可以輕鬆地將整個數據庫或選定的數據庫組件(如表,視圖,SP,函數等)導出到現有數據庫。

+0

聽起來像無恥的插頭 –

相關問題