【发布时间】:2014-03-01 06:00:38
【问题描述】:
我的服务器有 100 多个链接到其他数据库服务器的数据库。这些数据库具有链接表的视图。我需要每周更新链接服务器中任何对象更改的视图,即添加列。
我创建了这个脚本来遍历所有数据库并获取所有视图并通过更改视图刷新它们。 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
【问题讨论】:
标签: sql-server tsql