如何将表从一个SQL Server数据库移动到另一个?

时间:2010-08-26 19:26:10

标签: sql sql-server sql-server-2005

我们有一个数据库已经增长到大约50GB,我们想要从该数据库中提取一组特定的表(大约20个)并将它们移动到一个新的数据库中。所有这些都将在同一个SQL Server上。我们想要提取的表大约有12GB的空间(6GB数据,6GB索引)。

我们如何将表从一个数据库移动到第二个数据库,但是确保在新数据库中创建的表是原始数据的索引(索引,键等)?理想情况下,我想从SQL Server Management Studio中复制/粘贴,但我知道这不存在,那么我的选择是什么?

7 个答案:

答案 0 :(得分:27)

使用SQL Server 2008 Management Studio非常轻松地执行此操作:

1。)右键单击数据库(而不是表格),然后选择任务 - >生成脚本

location of tool

2.。)在第一页上单击“下一步”

3.。)如果要复制整个数据库,只需单击“下一步”。如果要复制特定表,请单击“选择特定数据库对象”,选择所需的表,然后单击“下一步”。

4.。)选择“保存到剪贴板”或“保存到文件”。 重要:单击“保存到文件”旁边的“高级”按钮,找到“脚本数据类型”,然后将“仅模式”更改为“模式和数据”(如果要创建表格) )或“仅数据”(如果您将数据复制到现有表)。这也是您设置其他选项的地方,例如确切要复制的键等等。

adding data to the script

5.点击其余部分,你就完成了!

答案 1 :(得分:7)

如果您因为增长而将表移动到一个全新的数据库,那么考虑在现有数据库中使用filegroups可能会更好。与试图处理两个独立的数据库相比,将来会有更少的麻烦。

修改

正如我在下面的评论中提到的,如果你确实需要一个新的数据库,根据所涉及的表的总数,可能更容易以新名称恢复数据库的备份并删除你不知道的表我想要。

答案 2 :(得分:2)

我也使用SQL Server Management Studio找到了这个潜在的解决方案。您可以使用SQL Server Management Studio中的“生成脚本向导”和“导入/导出向导”生成要移动的特定表的脚本,然后导出数据。然后在新数据库上运行脚本以创建所有对象,然后导入数据。我们可能会按照@Joe Stefanelli的回答中的描述使用备份/恢复方法,但我确实找到了这种方法,并希望将其发布给其他人查看。

为对象生成sql脚本:

  • SQL Server Management Studio>数据库>数据库1>任务>生成脚本......
  • SQL Server脚本向导将启动,您可以选择要导出到脚本中的对象和设置
    • 默认情况下,不包含索引和触发器的脚本,因此请务必将其打包(以及您感兴趣的任何其他人)。

从表中导出数据:

  • SQL Server Management Studio>数据库>数据库1>任务>导出数据......
  • 选择源和目标数据库
  • 选择要导出的表格
    • 确保检查每个表的“标识插入”复选框,以便不创建新标识。

然后创建新数据库,运行脚本以创建所有对象,然后导入数据。

答案 3 :(得分:1)

如果您喜欢/拥有SSIS,可以使用“复制SQL对象任务”组件进行探索。

答案 4 :(得分:1)

在T-SQL中执行此操作的一种懒惰,有效的方法:

在我的情况下,有些表很大,因此编写数据脚本是不切实际的。

此外,我们只需迁移一小部分非常大的数据库,因此我不想进行备份/恢复。

所以我选择INSERT INTO / SELECT FROM并使用information_schema等来生成代码。

第1步:在新数据库

上创建表

对于要迁移到新数据库的每个表,请在新数据库上创建该表。

要么编写表格,要么使用SQL Compare,来自information_schema的动态sql - 有很多方法可以做到这一点。 dallin的答案显示了使用SSMS的一种方式(但一定要选择模式)。

步骤2:在目标数据库上创建UDF以生成列列表

这只是生成代码时使用的辅助函数。

USE [staging_edw]
GO

CREATE FUNCTION dbo.udf_get_column_list
    (
        @table_name varchar(8000)
    )
RETURNS VARCHAR(8000)
AS
BEGIN

    DECLARE @var VARCHAR(8000)
    SELECT 
        @var = COALESCE(@var + ',', '', '') + c.COLUMN_NAME
    FROM INFORMATION_SCHEMA.columns c 
    WHERE c.TABLE_SCHEMA + '.' + c.TABLE_NAME = @table_name
    AND c.COLUMN_NAME NOT LIKE '%hash%'

    RETURN @var
END

第3步:创建日志表

生成的代码会将进度记录到此表中,以便您进行监控。但是你必须先创建这个日志表。

USE staging_edw
GO

IF OBJECT_ID('dbo.tmp_sedw_migration_log') IS NULL 
CREATE TABLE dbo.tmp_sedw_migration_log 
    (
        step_number INT IDENTITY, 
        step VARCHAR(100),
        start_time DATETIME
    )

第4步:生成迁移脚本

在这里,您将生成将为您迁移数据的T-SQL。它只为每个表生成INSERT INTO / SELECT FROM语句,并记录其进度。

此脚本实际上不会修改任何内容。它只输出一些代码,您可以在执行之前检查它们。

USE staging_edw
GO

-- newline characters for formatting of generated code
DECLARE @n VARCHAR(100) = CHAR(13)+CHAR(10)
DECLARE @t VARCHAR(100) = CHAR(9)
DECLARE @2n VARCHAR(100) = @n + @n
DECLARE @2nt VARCHAR(100) = @n + @n + @t
DECLARE @nt VARCHAR(100) = @n + @t
DECLARE @n2t VARCHAR(100) = @n + @t + @t
DECLARE @2n2t VARCHAR(100) = @n + @n + @t + @t
DECLARE @3n VARCHAR(100) = @n + @n + @n

-- identify tables with identity columns
IF OBJECT_ID('tempdb..#identities') IS NOT NULL 
DROP TABLE #identities;
SELECT 
    table_schema = s.name,
    table_name = o.name
INTO #identities
FROM sys.objects o 
JOIN sys.columns c on o.object_id = c.object_id
JOIN sys.schemas s ON s.schema_id = o.schema_id
WHERE 1=1
AND c.is_identity = 1

-- generate the code
SELECT 
    @3n + '-- ' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME,
    @n + 'BEGIN TRY',
    @2nt + IIF(i.table_schema IS NOT NULL, 'SET IDENTITY_INSERT staging_edw.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' ON ', ''),
    @2nt + 'TRUNCATE TABLE staging_edw.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME,
    @2nt + 'INSERT INTO staging_edw.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' WITH (TABLOCKX) ( ' + f.f + '  ) ',
    @2nt + 'SELECT ' + f.f + + @nt + 'FROM staging.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME,
    @2nt + IIF(i.table_schema IS NOT NULL, 'SET IDENTITY_INSERT staging_edw.' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' OFF ', ''),
    @2nt + 'INSERT INTO dbo.tmp_sedw_migration_log ( step, start_time ) VALUES  ( ''' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' inserted successfully'', GETDATE() );' ,
    @2n + 'END TRY',
    @2n + 'BEGIN CATCH',
    @2nt + 'INSERT INTO dbo.tmp_sedw_migration_log ( step, start_time ) VALUES  ( ''' + t.TABLE_SCHEMA + '.' + t.TABLE_NAME + ' FAILED'', GETDATE() );' ,
    @2n + 'END CATCH'
FROM INFORMATION_SCHEMA.tables t
OUTER APPLY (SELECT f = staging_edw.dbo.udf_get_column_list(t.TABLE_SCHEMA + '.' + t.TABLE_NAME)) f
LEFT JOIN #identities i ON i.table_name = t.TABLE_NAME 
    AND i.table_schema = t.TABLE_SCHEMA
WHERE t.TABLE_TYPE = 'base table'

第5步:运行代码

现在您只需复制步骤4的输出,粘贴到新的查询窗口,然后运行。

注释

  • 在步骤1中,我从列列表中排除哈希列(在UDF中),因为那些是我的情况下的计算列

答案 5 :(得分:0)

SELECT *
INTO new_table_name [IN new database]
FROM old_tablename

答案 6 :(得分:0)

尝试使用DBSourceTools http://dbsourcetools.codeplex.com
此工具集使用SMO将表和数据编写到磁盘,还允许您选择要包含的表/视图/存储过程。
使用“部署目标”时,它还会自动处理依赖关系 我已经反复使用它来解决这类问题,而且它非常简单快速。