簡體   English   中英

在SQL Server 2008中,如何將數據從數據庫復制到另一個數據庫?

[英]In SQL Server 2008, how should I copy data from database to another database?

我正在嘗試編寫一個存儲過程,以將數據的子集從一組表復制到另一個數據庫中的同一組表。 “源”數據庫必須是存儲過程的參數。

我已經為此苦苦掙扎了兩天,我認為我有一個很好的解決方案:

  1. 驗證架構是否相同。
  2. 使用動態SQL為源表創建臨時的“ rmt”同義詞。
  3. 使用INSERT INTO A SELECT * FROM rmtA WHERE <條件>復制數據
  4. 刪除同義詞。

這對於大多數表來說效果很好,但是對於包含標識列的表,我不僅被迫設置SET IDENTITY_INSERT ON&OFF,而且更糟糕的是,我不能使用SELECT *; 我必須明確指定所有列。 如果稍后添加或刪除列,這將是一場噩夢。

我必須要解決一些問題,所以現在我要使用此解決方案,但是我想認為在某個地方有更好的解決方案。

救命?

聽起來您在存儲過程中使用了動態SQL,因此您已經准備好在SELECT子句中動態創建列列表。

您可以從sys.columns中選擇以獲取列列表,並了解該表是否具有標識列。 這是一個查詢,顯示了創建列列表所需的信息。

SELECT c.name, is_identity
FORM sys.columns c
WHERE object_id = object_id('MyTable')

簡而言之,如果至少一列的is_identity為1,則需要包括SET IDENTITY_INSERT 並且,您將從SELECT子句中is_identity = 1的任何列。

並且,此方法將適應您添加到表中的新列。

這是一個例子

DECLARE @TableName varchar(128) = 'MyTableName'
DECLARE @ColumnName varchar(128)
DECLARE @IsIdentity bit
DECLARE @TableHasIdentity bit = 0
DECLARE @sql varchar(2000) = 'SELECT '

-- create cursor to step through list of columns
DECLARE MyCurs CURSOR FOR
SELECT c.name, is_identity
FROM sys.columns c
WHERE object_id = object_id(@TableName)
ORDER BY column_id

-- open cursor and get first row
OPEN MyCurs
FETCH NEXT FROM MyCurs INTO @ColumnName, @IsIdentity

-- process each column in the table
WHILE @@FETCH_STATUS = 0
  BEGIN
    IF @IsIdentity = 0
-- add column to the SELECT clause
        SET @sql = @sql + @ColumnName + ', '
    ELSE
-- indicate that table has identity column  
        SET @TableHasIdentity = 1

-- get next column
    FETCH NEXT FROM MyCurs INTO @ColumnName, @IsIdentity
  END

-- cursor cleanup
CLOSE MyCurs
DEALLOCATE MyCurs

-- add FROM clause
SET @sql = LEFT(@sql, LEN(@sql)-1) + CHAR(13) + CHAR(10) + 'FROM ' + @TableName

-- add SET IDENTITY if necessary
IF @TableHasIdentity = 1
    SET @sql = 'SET IDENTITY_INSERT ' + @TableName + ' ON' + CHAR(13) + CHAR (10)
                + @sql + CHAR(13) + CHAR (10)
                + 'SET IDENTITY_INSERT ' + @TableName + ' OFF'

PRINT @sql

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM