Sql 如何在所有DB';它在服务器上

Sql 如何在所有DB';它在服务器上,sql,sql-server,Sql,Sql Server,我最近需要删除并重新创建服务器上所有数据库的视图。我们最初的脚本使用了一个游标,我们发现它有点低效。在我之前询问的一个问题中,sys.sp_MSforeachdb程序引起了我的注意。我能够用它来做需要的事情 你只需要注意exec语句的长度。显然有一个长度限制,在我删除所有别名并合并select语句之前,我使用的脚本都会抛出错误。我在其中有大约80列,分别放在不同的行中。有一些别名是必需的,所以我显然把它们放在了需要的地方。这是我最后得到的脚本: USE [Master] EXECUTE mas

我最近需要删除并重新创建服务器上所有数据库的视图。我们最初的脚本使用了一个游标,我们发现它有点低效。在我之前询问的一个问题中,sys.sp_MSforeachdb程序引起了我的注意。我能够用它来做需要的事情


你只需要注意exec语句的长度。显然有一个长度限制,在我删除所有别名并合并select语句之前,我使用的脚本都会抛出错误。我在其中有大约80列,分别放在不同的行中。有一些别名是必需的,所以我显然把它们放在了需要的地方。

这是我最后得到的脚本:

USE [Master]

EXECUTE master.sys.sp_MSforeachdb 
'USE [?]; IF db_name() NOT IN  (''master'',''model'',''msdb'',''ReportServer'',''ReportServerTempDB'',''tempdb'')
BEGIN USE ?

    IF  EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N''[ViewName]''))
        DROP VIEW [ViewName]

    EXEC(''
            CREATE VIEW ViewName AS

            SELECT
            db_name() DBName, a.Col1,a.Col2,a.Col3,t.Col1

            FROM Activity a
            LEFT OUTER JOIN TerminologyCache t ON a.ActivityTypeName = t.TerminologyKeyName
            WHERE
            a.activityProviderName = ''''Parm1''''
            and (ISNULL(t.TerminologyCultureName,''''en-US'''') = ''''en-US'''')

        '')

END'

一旦我格式化了它,我就有一个答案要发布。为什么不将这个方法封装在executesql方法中呢?在你的数据库中如此赤裸裸地运行这个似乎有点冒险。