2015-12-31 20 views
0

定期我必須複製數據庫並更新一組約50個視圖指向一個相關的數據庫。我有SQL,我可以用它來生成ALTER VIEW語句的一個片段,它是這樣的:使用exec和動態SQL來更改/重新定位視圖與SQL Server

SELECT 
    REPLACE (REPLACE (sm.definition, 'CREATE VIEW', 'ALTER VIEW'), 
    'old_db_name.', 'new_db_name.') + ' 
    GO' 
FROM 
    sys.sql_modules sm 
    JOIN 
    sys.objects o ON sm.object_id = o.object_id 
    WHERE 
    sm.definition LIKE '%old_db_name.%' AND o.type = 'V' 

這個SQL運行並返回一組SQL語句,我可以剪切和粘貼到第二個查詢窗口更新視圖。但是,爲50個視圖做這件事很乏味,所以我想用一些代碼來包裝這些代碼來自動運行這些更新。我做了一個嘗試,但由於某種原因它失敗了。這裏是我的代碼:

declare @view_replace table (sql varchar(8000)) 
DECLARE @sql varchar(8000) 

INSERT INTO @view_replace (sql) 
SELECT 
    REPLACE (REPLACE (sm.definition, 'CREATE VIEW', 'ALTER VIEW'),  
    'old_db_name.', 'new_db_name.') + ' 
    GO' 
FROM 
    sys.sql_modules sm 
    JOIN 
    sys.objects o ON sm.object_id = o.object_id 
WHERE 
    sm.definition LIKE '%old_db_name.%' AND o.type = 'V' 

DECLARE c CURSOR FOR SELECT sql FROM @view_replace 
OPEN c 
FETCH NEXT FROM c 
INTO @sql 

WHILE @@FETCH_STATUS = 0 
BEGIN 
exec (@sql) 
FETCH NEXT FROM c 
END 

CLOSE c 
DEALLOCATE c 

這將運行沒有錯誤,我看什麼樣子運行51條ALTER VIEW語句,但沒有在數據庫中已經改變了!視圖仍然指向舊的數據庫。我錯了什麼?接下來,這是編寫這種改變的最有效方法嗎?我使用的是SQL Server 2012的

回答

1

你在循環忘帶了什麼東西

WHILE @@FETCH_STATUS = 0 
BEGIN 
    exec (@sql) 
    FETCH NEXT FROM c-->>>>> into @sql 
END 

所以只有第一條語句執行