代码之家  ›  专栏  ›  技术社区  ›  IordanTanev

SQL Server 2005中的执行问题

  •  1
  • IordanTanev  · 技术社区  · 14 年前

    我有两个相同结构的数据库。第一个在其数据表中有一些数据。我需要创建一个脚本,将数据从第一个数据库传输到第二个数据库。我已经创建了这个脚本。

    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 
    

    问题是,当我运行脚本时,“print@query”语句会像这样打印语句

    INSERT INTO table SELECT * FROM MyDataBase.dbo.table
    

    当我复制这个并从管理工作室运行它时,它工作得很好。但是当脚本尝试用exec运行它时,我会得到这个错误

    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.
    

    希望有人能告诉我这是怎么回事。

    顺祝商祺!

    伊奥丹·塔涅夫

    2 回复  |  直到 14 年前
        1
  •  1
  •   gbn    14 年前

    为了准确地解决你的问题…

    您需要使其成为“动态SQL”

    exec (@query)
    

    EXEC @Query 实际上是 EXEC @module_name_var 没有括号。见 EXEC 在msdn中。您希望“执行字符串”而不是“执行存储过程或函数”

    不过,我会考虑投资 Red Gate Compare bundle 如果你需要经常做的事

        2
  •  2
  •   marc_s    14 年前

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

    在这种情况下,你会有这样的陈述:

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

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

    在上查看一些资源 有关详细信息: