我们允许我们使用更改报表的某些视图,以及不基于我们在应用程序中跟踪的某些应用程序字段元数据的内容。可以在运行时创建这些字段。我有一个标准流程来在添加或删除字段时更改视图。我现在需要以编程方式执行此操作,这意味着我需要能够拉出当前的Alter视图脚本,进行修改,然后针对数据库执行它。最后两个步骤很简单,但第一部分给了我一些麻烦。
除了设计决策(因为在这个特定实例中它们不在我手中)。我想知道如何检索Sql server Management Studio用于View-> Edit命令的Alter视图脚本。
我需要与该命令完全相同的输出,因为我的脚本中有注释钩子,允许我的编辑发生。
相关问题,但不是我想要的。
In MSSQL, how do I generate a CREATE TABLE statement for a given table?
答案 0 :(得分:6)
SSMS使用SMO。 Scripter可以检索任何SQL对象的定义。
如果你想要一个基于T-SQL的方法,然后使用sys.sql_modules,它包含数据库中每个非加密对象的T-SQL定义,包括视图。
答案 1 :(得分: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
答案 2 :(得分:3)
您可以从Information_Schema.Views表中获取View创建脚本:
SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME='<view name>'
从那里你可以改变它来建立你需要的ALTER。
答案 3 :(得分: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语句返回。但它在一行上,所以我必须在任何评论后插入换行符。我们必须看看结果是多么可行。