繁体   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