代码之家  ›  专栏  ›  技术社区  ›  Matthew Vines

如何在SQL Server 2005中以编程方式检索视图的alter view脚本

  •  2
  • Matthew Vines  · 技术社区  · 15 年前

    我们允许我们的应用程序根据我们在应用程序中跟踪的一些应用程序字段元数据来更改报表的某些视图以及其他视图。这些字段可以在运行时创建。我有一个标准的流程,可以在添加或删除字段时更改视图。不过,我现在需要以编程方式完成这项工作,这意味着我需要能够提取当前的alter view脚本,进行修改,然后针对数据库执行它。最后两步很容易,但第一部分给了我一些麻烦。

    把设计决策放在一边(因为在这个特定的例子中它们是我无法控制的)。我想知道如何检索SQL Server Management Studio用于view->edit命令的alter view脚本。

    我需要与该命令完全相同的输出,因为我的脚本中有注释挂钩,允许进行编辑。

    相关问题,但不完全符合我的要求。

    How do I programmatically retrieve SQL Server stored procedure source that is identical to the source returned by the SQL Server Management Studio gui?

    In MSSQL, how do I generate a CREATE TABLE statement for a given table?

    4 回复  |  直到 13 年前
        1
  •  6
  •   Remus Rusanu    15 年前

    SSMS在封面下使用SMO。这个 Scripter 无法检索任何SQL对象的定义。

    如果需要基于T-SQL的方法,请使用 sys.sql_modules ,它包含数据库中每个非加密对象(包括视图)的T-SQL定义。

        2
  •  4
  •   Aaron Bertrand    15 年前
    SELECT [definition] 
    FROM sys.sql_modules
    WHERE [object_id] = OBJECT_ID('dbo.' + @ViewName);
    
    -- you don't need the type check if you are passing in the name of a view
    -- you can do the schema check using OBJECT_ID instead of an extra join
    
    -- if you want to reference system_sql_modules it is unlikely they
    -- will have dbo schema, if you want to support this use a separate query IMHO
    
        3
  •  3
  •   Frank Pellett    13 年前

    您可以从information_schema.views表中获取视图创建脚本:

    SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME='<view name>'
    

    从那里你可以改变它来构建你所需要的改变。

        4
  •  0
  •   Matthew Vines    15 年前

    我想我终于有了答案。在浏览SQL事件探查器时,我发现一个查询,我将其修改为以下内容。

    DECLARE @ViewName VARCHAR(255)
    
    SET @ViewName = N'vwMyView'
    
    SELECT
        ISNULL(smv.definition, ssmv.definition) AS [Definition]
    FROM
        sys.all_views AS v
        LEFT OUTER JOIN sys.sql_modules AS smv ON smv.object_id = v.object_id
        LEFT OUTER JOIN sys.system_sql_modules AS ssmv ON ssmv.object_id = v.object_id
    WHERE
        (v.type = 'V') and (v.name = @ViewName and SCHEMA_NAME(v.schema_id) = N'dbo')
    

    这将以“创建视图”DDL语句的形式返回视图脚本,并添加注释。但是它在一行上,所以我必须在任何注释后插入新行。我们必须看看这是多么可行。