Sql-Server

使用游標從一個數據庫中的表中複製數據並填充另一個數據庫中的空表?

  • March 28, 2022

基本上“DB A”包含與“DB B”相同的表,但“DB B”表是空的,我可以創建一個游標,通過用 DB A 的內容填充 DB B 中的表來創建備份嗎?

如果它是一個特定的表和 insert.into 語句,我可以想辦法做到這一點,但我正在尋找方法來處理所有表,無論數量如何。

我將從頭開始(即創建一個新的目標數據庫)並使用快照複製 - 這會將架構導出到腳本文件並將數據導出到文件並在目標數據庫上創建表並使用批量載入來導入數據。非常快

游標通常用於迭代數據集(例如表)中的行,因此如果您需要動態處理不同數量的表,則此處不適用。相反,您可能希望在系統視圖中利用動態 SQLsys.tables ,或者您可以使用未記錄的過程sp_MSforeachtable

對於後一種解決方案,您可以執行以下操作:

EXEC sp_MSforeachtable 'INSERT INTO DatabaseB.SchemaName.? SELECT * FROM DatabaseA.SchemaName.?;'

請注意,您通常不應該使用SELECT *,而是應該顯式指定列名,但這是一個案例,您可能希望在一個數據庫中的架構發生變化而不是另一個數據庫中發生錯誤時拋出錯誤,並且使用SELECT *可以說是可以的。

如評論中所述,在特定情況下可能會遇到問題sp_MSforeachtable(類似於sp_MSforeachdb眾所周知的),因此使用風險自負。

或者,這是 Aaron Bertrand 關於在視圖中使用動態 SQL的一個很好的範例答案。sys.tables

從他的 Aaron 的例子中得出,你可以用類似這樣的東西來實現你的目標:

DECLARE @DynamicSQL NVARCHAR(MAX) = N'';

SELECT @DynamicSQL = @DynamicSQL + 'INSERT INTO '
   + QUOTENAME('DatabaseB') + '.'
   + QUOTENAME('SchemaName') + '.'
   + QUOTENAME(name)
   + ' SELECT * FROM '
   + QUOTENAME('DatabaseA') + '.'
   + QUOTENAME('SchemaName') + '.'
   + QUOTENAME(name) + '; '
FROM sys.tables;

PRINT @DynamicSQL; -- For verifying the dynamically generated SQL
-- EXEC sp_executesql @DynamicSQL; -- Executes the dynamically generated SQL

引用自:https://dba.stackexchange.com/questions/295943