2

我们允许我们的用户根据我们在应用程序中跟踪的某些应用程序字段元数据来更改报告的某些视图以及哪些视图。这些字段可以在运行时创建。我有一个标准流程来在添加或删除字段时更改视图。但是,我现在需要以编程方式执行此操作,这意味着我需要能够提取当前的 Alter 视图脚本,进行修改,然后针对数据库执行它。最后两个步骤很简单,但第一部分给我带来了一些麻烦。

抛开设计决策(因为在这个特定情况下它们不在我的控制范围内)。我想知道如何检索 Sql server management studio 用于 View->Edit 命令的 Alter 视图脚本。

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

相关问题,但不是我想要的。

如何以编程方式检索与 SQL Server Management Studio gui 返回的源相同的 SQL Server 存储过程源?

在 MSSQL 中,如何为给定的表生成 CREATE TABLE 语句?

4

4 回答 4

6

SSMS 在幕后使用 SMO。Scripter可以检索任何 SQL 对象的定义。

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

于 2009-11-19T19:11:05.643 回答
4
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
于 2009-11-19T21:45:49.173 回答
3

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

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

从那里您可以根据需要对其进行更改以构建您的 ALTER。

于 2011-02-18T17:13:31.283 回答
0

我想我终于有了答案。浏览 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 语句。但是它在一行上,所以我必须在任何评论后插入换行符。我们将不得不看看这是否可行。

于 2009-11-19T19:21:54.280 回答