在SQL Server 2005执行问题
问题描述:
我有我有两个相同结构的数据库的情况。第一个数据表中有一些数据。我需要创建一个将数据从第一个数据库传输到第二个数据库的脚本。我已经创建了这个脚本。在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
答
解决您的问题,究竟...
你需要使其 “动态SQL”
exec (@query)
EXEC @Query
实际上EXEC @module_name_var
没有括号。请参阅MSDN中的EXEC。你想“执行字符串”不“执行存储过程或函数”
不过,我会的东西考虑投资像Red Gate Compare bundle如果您需要经常做
答
你可以尝试使用无证,但非常有用的sp_msForEachTable
存储过程来实现这一点 - 而不是使用游标执行动态SQL。
在这种情况下,你就会有一个说法是这样的:
exec sp_MSforeachtable @command1 = 'INSERT INTO ? SELECT * FROM MyDatabase.?'
其中?将替换为数据库中每个表的实际表名。这要求表格已经存在于目标数据库中。
更多细节检查出sp_msForEachTable
一些资源:
其一,错误信息的东西只显示数据库部分或表名(我不知道MPDEV090314应该是什么)。也许这会更好,如果你发布实际的打印@Query语句而不是*这样的东西* – 2010-04-02 07:41:12