當前位置:
首頁 > 最新 > 如何在SQL Server中將表從一個資料庫複製到另一個資料庫

如何在SQL Server中將表從一個資料庫複製到另一個資料庫

在某些情況下,作為DBA,您需要將模式和特定表的內容從資料庫複製到同一實例中或在不同的SQL實例中,例如從生產資料庫中複製特定表到開發人員以進行測試或排除故障。

SQL Server提供了許多方法,可以用來執行表的數據和模式複製過程。為了研究這些方法中的每一個,我們將考慮下面的場景:

託管SQL伺服器:localhost。這兩個資料庫都駐留在同一個SQL Server 2014實例中。

源資料庫:AdventureWorks2012。

目標資料庫:SQLShackDemo。

將從源資料庫複製到目標資料庫的表有:Department、Employee、EmployeeDepartmentHistory和EmployeePayHistory。

表複製方法:


使用 SELECT INTO 查詢語句

為了將我們的表從AdventureWorks2012資料庫複製到SQLShackDemo資料庫,我們可以使用SELECT INTO SQL語句。該語句將首先在目標資料庫中創建表,然後將數據複製到這些表中。如果您設法複製資料庫對象,如索引和約束,您需要為它單獨生成腳本,然後您需要將腳本應用到目標資料庫。

在我們的示例中,要將AdventureWorks2012資料庫中的Department、Employee、EmployeeDepartmentHistory和EmployeePayHistory表按照HumanResources模式從AdventureWorks2012資料庫複製到SQLShackDemo資料庫,我們將運行以下腳本:

Select*intoSQLShackDemo.HumanResources.DepartmentfromAdventureWorks2012.HumanResources.Department

Select*intoSQLShackDemo.HumanResources.EmployeefromAdventureWorks2012.HumanResources.Employee

Select*intoSQLShackDemo.HumanResources.EmployeeDepartmentHistoryfromAdventureWorks2012.HumanResources.EmployeeDepartmentHistory

Select*intoSQLShackDemo.HumanResources.EmployeePayHistoryfromAdventureWorks2012.HumanResources.EmployeePayHistory

目標表中的列按select語句中指定的順序創建。所有這些列都具有源表中的確切名稱、數據類型、nullability屬性和列值。

如果任何錶包含標識列,目標表中的新列將繼承標識屬性,而不需要打開IDENTITY_INSERT。

這在大多數情況下都是有效的,除非SELECT語句包含JOIN,否則使用UNION來連接多個SELECT語句,在SELECT語句中多次提到IDENTITY列,或者該標識列的源是遠程數據源。

如果上述條件中的任何一個為真,則將使用非空屬性創建列,而不是繼承所需的標識屬性。

為了克服這個身份問題,您可以使用select語句中的IDENTITY SQL函數來創建標識列。


使用SQL Server導出/導入嚮導

另一種可用於將源資料庫中的表複製到目標資料庫的方法是SQL Server Export和Import wizard,它在SQL Server Management Studio中可用。您可以選擇從源資料庫導出或從目標資料庫導入,以便傳輸數據。

在SQL Server Management Studio中,右鍵單擊object explorer中的AdventureWorks2012資料庫,然後選擇Tasks ->導出數據:

在「選擇導入和導出嚮導」的數據源窗口中,指定源伺服器名稱、用於連接源伺服器的身份驗證方法以及源資料庫名稱,然後單擊Next。

在SQL導入和導出嚮導的選擇目標窗口中,指定目標伺服器名稱、用於連接目標伺服器的身份驗證方法和目標資料庫名稱,然後單擊Next。

在SQL導入和導出嚮導的指定表複製或查詢中,從一個或多個表或視圖中選擇複製數據。單擊Next。

在SQL導入和導出嚮導的Select源表和視圖中,選擇將從所選源資料庫複製到目標資料庫的表,然後單擊Next

為了確保將在目標資料庫中創建表,請單擊Edit Mappings,確保創建目標表被選中,如果您的任何錶包含標識列,請確保選中Enable IDENTITY Insert,然後單擊OK。如果要將多個表導出到目標資料庫,則需要逐個查看編輯映射檢查表。

在「選擇源表和視圖」中單擊「下一步」。

在Run包中,單擊Next。

在完成嚮導時,單擊Finish。

成功完成執行之後,您可以查看遷移表所遵循的步驟和傳輸的記錄數量。檢查步驟和消息,如果沒有錯誤,請單擊Close。

如果您安排將表複製到目標資料庫,而不關心表的關係和順序,那麼此方法是將表從源資料庫複製到目標資料庫的一種快速方法。

使用此方法,表的索引和鍵將不會被轉移。如果您有興趣複製它,您需要為這些資料庫對象生成腳本。

如果這些是連接這些表的外鍵,則需要以正確的順序導出數據,否則導出嚮導將失敗。


Generate Scripts

SQL Server提供了另一種為SQL Server資料庫及其對象和數據生成腳本的方法。此腳本可用於將表的模式和數據從源資料庫複製到目標資料庫。

使用SQL Server Management Studio,從對象資源管理器右鍵單擊源資料庫,然後從任務選擇生成腳本。

在「選擇對象」窗口中,選擇「選擇特定的資料庫對象」,以指定要為其生成腳本的表,然後通過在表的每個表旁邊勾選這些表。單擊Next。

在Set腳本選項窗口中,指定你要保存生成腳本文件的路徑,然後單擊Advanced。

在「出現的高級腳本選項」窗口中,將模式和數據指定為腳本的數據類型。您可以從這裡決定是否要在表中編寫索引和鍵。單擊OK。

回到高級腳本選項窗口,單擊Next。

查看Summary窗口並單擊Next。

您可以從Save或Publish Scripts窗口監視進度。如果沒有錯誤,單擊Finish,您將在指定的路徑中找到腳本文件。

SQL腳本方法對於為表的模式和數據(包括索引和鍵)生成一個腳本非常有用。但是,如果表之間有關係,這個方法不會以正確的順序生成表的創建腳本。


使用ApexSQL Diff和ApexSQL數據Diff組合

ApexSQL Diff是一個有用的SQL工具,它可以用來發現資料庫與模式之間的差異,並生成同步腳本以正確的順序在目標資料庫中創建這些表。

ApexSQL Data Diff也是一種SQL工具,可以使用它從數據端查找資料庫之間的差異,並生成同步腳本,在目標資料庫表中插入數據,同時考慮到IDENITY列。

我們可以利用這兩個工具的優點來生成所需的腳本,以創建與其對象一起複制的表,並將數據從源表複製到目標表。

啟動ApexSQL Diff工具。

在數據源面板中,指定源伺服器名、源資料庫名和用於連接源伺服器的身份驗證方法。如果選擇SQL Server身份驗證,則需要指定有效的使用名稱和密碼。

還指定目標伺服器名稱、目標資料庫名稱和用於連接目標伺服器的身份驗證方法。如果選擇SQL Server身份驗證,則需要指定有效的使用名稱和密碼。

您可以通過單擊Reverse來更改指定為源或目標伺服器的每個伺服器的角色。然後單擊連接。

點擊進行比較。

將顯示一個新窗口,其中包含兩個資料庫之間常見的對象,這些對象存在於其中一個資料庫中,但在第二個資料庫中不存在。

在我們的示例中,我們對存在於AdventureWorks2012資料庫中而不存在於SQLShackDemo資料庫中的對象感興趣,在這個資料庫中,我們可以找到要複製的表。

展開僅存在於AdventureWorks2012資料庫中的對象,並選擇要複製的表。點擊同步。

在同步嚮導窗口的同步方向中,如果不想更改同步方向,請單擊Next。

在「同步嚮導」窗口的依賴項中,如果不想編寫相關表的腳本,請取消對包含相關資料庫對象的檢查。單擊Next。

在「同步嚮導」窗口的輸出選項中,如果您想要生成腳本並手動運行腳本,請選擇創建一個同步腳本,或者現在就進行同步,以便工具可以直接在目標伺服器上運行腳本。單擊Next。

在「同步嚮導」窗口的摘要和警告中,檢查操作並單擊「創建腳本」。

現在生成了使用對象創建資料庫表的腳本,並按正確的順序生成。您可以在目標資料庫上運行此腳本來創建表。

啟動ApexSQL數據Diff工具。

在數據源面板中,指定源伺服器名、源資料庫名和用於連接源伺服器的身份驗證方法。如果選擇SQL Server身份驗證,則需要指定有效的使用名稱和密碼。

還指定目標伺服器名稱、目標資料庫名稱和用於連接目標伺服器的身份驗證方法。如果選擇SQL Server身份驗證,則需要指定有效的使用名稱和密碼。

您可以通過單擊Reverse來更改指定為源或目標伺服器的每個伺服器的角色。然後單擊連接。

點擊進行比較。

將顯示一個新窗口,該窗口包含源資料庫表和目標資料庫之間的數據差異,以及相同和不可比較的數據。

這裡我們感興趣的是源資料庫和目標資料庫中的表之間的差異。與前面的步驟一樣,我們創建了這些表,但它仍然是空的。

從差異結果網格中,選擇需要將數據複製到目標資料庫的表,然後單擊Synchronize。

在同步嚮導窗口的同步方向中,如果不想更改同步方向,請單擊Next。

在「同步嚮導」窗口的輸出選項中,如果您想要生成腳本並手動運行腳本,請選擇創建一個同步腳本,或者現在就進行同步,以便工具在目標伺服器上運行腳本。單擊Next。

在「同步嚮導」窗口的摘要和警告中,檢查操作並單擊「創建腳本」。

現在,將生成用於插入資料庫表(處理標識插入)的腳本。您可以在目標資料庫上運行此腳本,以插入表的數據。

ApexSQL Diff和ApexSQL數據Diff工具的組合對於複製SQL資料庫表很有用,方法是為這些表的模式生成一個完整的腳本,其中包含索引和鍵,並且順序正確,表的數據處理標識列插入。

使用ApexSQL腳本:

ApexSQL提供的另一個有用工具是ApexSQL腳本工具,它可用於將SQL Server表數據和模式從源資料庫複製到目標資料庫。這個不錯的工具將使用處理標識列插入的這些表的索引和鍵為資料庫表模式和數據創建腳本。

啟動ApexSQL腳本工具。

在Select database面板中,指定源伺服器名和用於連接源伺服器的身份驗證方法。如果選擇SQL Server身份驗證,則需要指定有效的使用名稱和密碼。單擊連接。

伺服器中託管的所有資料庫的列表將在正確的結果網格中查看。在我們的示例中選擇AdventureWorks2012的源資料庫名稱。

在數據面板中,從通用部分中選擇Set IDENTITY_INSERT,並從腳本行中插入section。單擊Open。

從顯示的窗口中,選擇要複製到目標資料庫的表,並單擊Script:

從腳本嚮導中選擇結構和數據作為腳本模式和T-SQL作為輸出類型。單擊Next。

在Dependencies窗口中,單擊Next。

在「輸出文件」窗口中,從「操作」下拉列表中選擇「創建」和「寫入文件」。然後您可以選擇將腳本保存到特定的路徑中,或者在編輯器中打開它。選擇編輯器中的打開腳本,然後單擊Create。

現在生成一個完整的腳本。只要在目標資料庫上運行它,表就會被完全複製。您可以通過腳本以正確的順序檢查表的創建腳本,如下所示:

還可以找到表數據的INSERT語句,如下所示:

ApexSQL腳本是一個非常有用的工具,可以使用它將SQL Server資料庫表從源資料庫複製到目標資料庫,而無需您自己處理表的創建順序。也不需要從您這邊來處理身份插入。


結論:

如您所見,可以使用多個方法將表從源資料庫複製到目標資料庫,包括模式和數據。這些工具中的大多數都需要您付出很大的努力來複製表的對象,比如索引和鍵。而且,如果表之間存在關係,這些工具也不會處理這些表的創建順序。從數據方面來看,這些工具中的大多數需要從您的一側額外的步驟來處理身份插入。使用ApexSQL Diff和ApexSQL數據Diff的組合,或者使用ApexSQL腳本,通過一些簡單的步驟,您將擁有一個完整的資料庫表模式和數據腳本,而無需您額外的努力來處理任何事情。只需在目標資料庫上運行這些腳本,並享受結果。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員之路 的精彩文章:

谷歌的家庭鏈接軟體現在推薦「教師認可」的應用
如何使用Redis進行微服務間通信

TAG:程序員之路 |