2010-04-02 64 views
1

我有我有两个相同结构的数据库的情况。第一个数据表中有一些数据。我需要创建一个将数据从第一个数据库传输到第二个数据库的脚本。我已经创建了这个脚本。在SQL Server 2005执行问题

DECLARE @table_name nvarchar(MAX), 
     @query nvarchar(MAX) 

DECLARE @table_cursor CURSOR 

SET @table_cursor = CURSOR FAST_FORWARD 
FOR 
    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 

    OPEN @table_cursor 
    FETCH NEXT FROM @table_cursor 
    INTO @table_name 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SET @query = 'INSERT INTO ' + @table_name + ' SELECT * FROM MyDataBase.dbo.' + @table_name 
     print @query 
     exec @query 

     FETCH NEXT FROM @table_cursor 
     INTO @table_name 
    END 

    CLOSE @table_cursor 
    DEALLOCATE @table_cursor 

的问题是,当我运行该脚本“打印@query”语句打印语句这样

INSERT INTO table SELECT * FROM MyDataBase.dbo.table 

当我复制本,并从管理Studio中运行它,它工作正常。但是当脚本尝试运行它与执行我得到这个错误

Msg 911, Level 16, State 1, Line 21 
Could not locate entry in sysdatabases for database 'INSERT INTO table SELECT * FROM MyDataBase'. No entry found with that name. Make sure that the name is entered correctly. 

希望有人可以告诉我whot是与这个战斗。

最好的问候,

约尔丹TANEV

+0

其一,错误信息的东西只显示数据库部分或表名(我不知道MPDEV090314应该是什么)。也许这会更好,如果你发布实际的打印@Query语句而不是*这样的东西* – 2010-04-02 07:41:12

回答

1

解决您的问题,究竟...

你需要使其 “动态SQL”

exec (@query) 

EXEC @Query实际上EXEC @module_name_var没有括号。请参阅MSDN中的EXEC。你想“执行字符串”不“执行存储过程或函数”

不过,我会的东西考虑投资像Red Gate Compare bundle如果您需要经常做

2

你可以尝试使用无证,但非常有用的sp_msForEachTable存储过程来实现这一点 - 而不是使用游标执行动态SQL。

在这种情况下,你就会有一个说法是这样的:

exec sp_MSforeachtable @command1 = 'INSERT INTO ? SELECT * FROM MyDatabase.?' 

其中?将替换为数据库中每个表的实际表名。这要求表格已经存在于目标数据库中。

更多细节检查出sp_msForEachTable一些资源: