[英]In SQL Server 2008, how should I copy data from database to another database?
我正在嘗試編寫一個存儲過程,以將數據的子集從一組表復制到另一個數據庫中的同一組表。 “源”數據庫必須是存儲過程的參數。
我已經為此苦苦掙扎了兩天,我認為我有一個很好的解決方案:
這對於大多數表來說效果很好,但是對於包含標識列的表,我不僅被迫設置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.