开发者

Exec problem in SQL Server 2005

开发者 https://www.devze.com 2022-12-25 04:47 出处:网络
I have the situation where i have two databases with same structure. The first have some data in its data tables. I need to create a script that will transfer the data from the first database to the s

I have the situation where i have two databases with same structure. The first have some data in its data tables. I need to create a script that will transfer the data from the first database to the second. I have created this script.

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 

The problem is that when I run the script the "print @query" statement prints statement like this

INSERT INTO table SELECT * FROM MyDataBase.dbo.table

When I copy this and run it from Management studio it works fine. But when the script tries to run it with exec I get this error

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开发者_如何学Python. Make sure that the name is entered correctly.

Hope someone can tell me whot is wront with this.

Best Regards,

Iordan Tanev


You could try and use the undocumented but extremely helpful sp_msForEachTable stored procedure to achieve this - instead of using a cursor to execute dynamic SQL.

In that case, you'd have a statement something like this:

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

where the ? would get replaced with the actual table name for each table in the database. This requires that the tables already exist in your target database.

Check out some resources on sp_msForEachTable for more details:

  • SQL Server Undocumented Stored Procedures sp_MSforeachtable and sp_MSforeachdb
  • 8 Common Uses of the undocumented Stored Procedure sp_MSforeachtable
  • Using sp_msForeachTable
  • The undocumented sp_MSforeachtable procedure


To solve your issue exactly...

You'd need to make it "dynamic SQL"

exec (@query)

EXEC @Query is actually EXEC @module_name_var with no brackets. See EXEC in MSDN. You want "Execute a character string" not "Execute a stored procedure or function"

However, I'd consider investing in something like Red Gate Compare bundle if it's something you need to do often

0

精彩评论

暂无评论...
验证码 换一张
取 消