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的