Exec проблема в SQL Server 2005 - PullRequest
1 голос
/ 02 апреля 2010

У меня есть ситуация, когда у меня есть две базы данных с одинаковой структурой. Первые имеют некоторые данные в своих таблицах данных. Мне нужно создать скрипт, который будет передавать данные из первой базы данных во вторую. Я создал этот скрипт.

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

Когда я копирую это и запускаю из Management studio, он работает нормально. Но когда скрипт пытается запустить его с 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 ]

2 голосов
/ 02 апреля 2010

Вы можете попробовать использовать недокументированную, но чрезвычайно полезную хранимую процедуру sp_msForEachTable для достижения этой цели - вместо использования курсора для выполнения динамического SQL.

В этом случае у вас будет что-то вроде этого:

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

где? будет заменено фактическим именем таблицы для каждой таблицы в базе данных. Для этого необходимо, чтобы таблицы уже существовали в вашей целевой базе данных.

Проверьте некоторые ресурсы на sp_msForEachTable для более подробной информации:

1 голос
/ 02 апреля 2010

Чтобы решить вашу проблему точно ...

Вам нужно сделать его "динамическим SQL"

exec (@query)

EXEC @Query на самом деле EXEC @module_name_var без скобок. См. EXEC в MSDN. Вы хотите "Выполнить строку символов", а не "Выполнить хранимую процедуру или функцию"

Тем не менее, я бы подумал о том, чтобы инвестировать что-то вроде Red Gate Compare bundle , если вам нужно часто это делать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...