當我有鏈接到其他數據庫服務器超過100個數據庫服務器。這些數據庫具有鏈接表的視圖。我需要每週更新視圖以查看鏈接服務器中的任何對象更改,即列添加。「<xyz>必須在查詢批處理的第一條語句」使用生成的DDL
我經歷了所有的數據庫創建此腳本中循環,並抓住所有的意見,並通過執行ALTER VIEW刷新它們。 sp_refreshview不適用於鏈接的服務器。
當我打印@sql變量,它在另一個查詢窗口工作正常。當我嘗試執行@sql變量,它給了我下面的錯誤:
Msg 111, Level 15, State 1, Line 3
'ALTER VIEW' must be the first statement in a query batch.
我認爲這事做與LF/CR。我嘗試了許多方法,但沒有運氣。
任何想法?
DECLARE @command varchar(1000)
CREATE TABLE #tempViewSQL (DBName VARCHAR(255)
,ViewSQL VARCHAR(4000))
SELECT @command = 'IF ''?'' NOT IN(''master''
, ''model''
, ''msdb''
, ''tempdb''
,''pubs''
,''AuditProduction''
,''AuditProductionTest''
,''IID_Support''
,''Insurance_Files''
,''LoansAnalysis''
,''QualityAudit''
,''QualityAuditTest'')
BEGIN
USE ?
INSERT INTO #tempViewSQL
SELECT TABLE_CATALOG, replace(view_definition,''create view'',''alter view'')
FROM information_schema.views
WHERE TABLE_NAME NOT IN (''syssegments'',''sysconstraints'')
END'
EXEC sp_MSforeachdb @command
DECLARE @SQLCursor VARCHAR(2000)
DECLARE @SQL VARCHAR(2000)
DECLARE @DbName VARCHAR(255)
DECLARE MyCursor CURSOR FOR
SELECT DBName, ViewSQL FROM #tempViewSQL
OPEN MyCursor
FETCH NEXT FROM MyCursor INTO @DbName,@SQLCursor
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = 'USE ' + @DBName + CHAR(10) + CHAR(13) + 'GO' + CHAR(10) + CHAR(13) + @SQLCursor
--PRINT (@SQL)
EXECUTE (@SQL)
FETCH NEXT FROM MyCursor INTO @DbName,@SQLCursor
END
CLOSE MyCursor
DEALLOCATE MyCursor
DROP TABLE #tempViewSQL