Sql 在架构更改脚本中将视图视为存储过程

Sql 在架构更改脚本中将视图视为存储过程,sql,sql-server,tsql,database-schema,Sql,Sql Server,Tsql,Database Schema,我已经编写了一个更改脚本来更新生产数据库中的模式。我必须删除一个视图并重新创建它们,因为该视图中的一列现在已被删除 我打算用 DECLARE @sql NVARCHAR(MAX); SET @sql = '<View Definition>'; EXEC sp_executesql @sql; 如果有的话,使用这种方法的陷阱是什么?你会建议哪些替代方案 我将整个脚本放在一个带有Try-catch块的事务下。因此,当没有错误时,脚本将被提交,否则将被回滚。我尝试使用下面的CREAT

我已经编写了一个更改脚本来更新生产数据库中的模式。我必须删除一个视图并重新创建它们,因为该视图中的一列现在已被删除

我打算用

DECLARE @sql NVARCHAR(MAX);
SET @sql = '<View Definition>';

EXEC sp_executesql @sql;
如果有的话,使用这种方法的陷阱是什么?你会建议哪些替代方案

我将整个脚本放在一个带有Try-catch块的事务下。因此,当没有错误时,脚本将被提交,否则将被回滚。我尝试使用下面的CREATE VIEW命令,但在引入TRASACTION和TRY-CATCH块后出现错误。这就是为什么要使用动态SQL语句-EXEC sp_executesql的原因

错误是CREATE VIEW必须是批处理中的唯一语句

IF EXISTS ( SELECT * FROM sys.views WHERE name = 'VwViewName')
BEGIN 
DROP VIEW VwViewName
END

IF NOT EXISTS ( SELECT * FROM sys.views WHERE name = 'VwViewName')
BEGIN 
     CREATE VIEW VwViewName
    <VIEW DEFINITION>
END    

因为您正在运行模式更新,所以您应该遵守以下最低要求:

让它重复 把它放在你的版本控制系统中 并在生产环境中运行之前在测试环境中进行测试。 为了使其可重新运行,通常的做法是检查对象是否存在并删除它,然后再次创建它

动态SQL不会添加IF子句具有的任何功能

例如:

IF EXISTS(SELECT * FROM sys.views WHERE name = 'MyView')
BEGIN
    DROP VIEW [MyView]
END
GO
CREATE VIEW MyView AS 
    SELECT [Columns list ]
    FROM [MyTable]
GO
我所知道的唯一证明动态SQL正确的情况是,如果您想保留grant/deny,在这种情况下,您可以使用以下语法

IF NOT EXISTS(SELECT * FROM sys.views WHERE name = 'MyView')
BEGIN
    EXEC sp_executesql N'CREATE VIEW MyView AS SELECT 1 AS Dummy'
END
GO
ALTER VIEW MyView AS 
    SELECT [Columns list ]
    FROM [MyTable]

go
GRANT .... 

我不会创建一个动态SQL来填充我必须在下面任何脚本中重复名称的几次。IMHO部署脚本应该尽可能简单

为什么要使用动态SQL?为什么不使用drop\create或alterview?请记住,删除将删除对视图的任何授权。实际上,我正在删除并重新创建。请阅读,这是在生产数据库中更改视图的标准。是吗?是的,这是很标准的过程。但是不使用动态SQL。那么您建议使用普通的drop/create而不是动态SQL execute命令?为什么会这样?请看下面我的回答。我确实将其存储在版本控制中,并在我的测试环境中进行多次测试。但是,我不确定我是否完全理解您所说的可重复性是什么意思?因为,变更脚本应该在生产数据库中只运行一次。参考:还是我对你的解释错了?关于第二条评论,你需要在CREATE上面加一个GO…关于你的第一条评论,使用动态SQL和事务并没有区别。至于repeatable,我的意思是,在研发、登台、QA、预生产或任何其他环境中,这些部署脚本通常会运行很多次,直到它们稳定为止,也就是说,很多次SQA发现许多需要更改脚本的bug和特性。因此,通常是从零开始恢复/重新生成环境,以多次运行这些脚本,直到它们达到基本的稳定性水平。@Learner,我看到了您的逻辑,如果不存在的话。。变得无关紧要,如果你不能放下,你周围的人就会把它捡起来,如果你设法放下,它就不存在了;因此,您可以保留创建视图…让我们