2010-04-02 65 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一些資源: