【发布时间】:2013-09-08 00:09:24
【问题描述】:
我编写了一个更改脚本来更新生产数据库中的架构。我必须删除一个视图并重新创建它们,因为该视图中的一列现在已被删除。
我打算用,
DECLARE @sql NVARCHAR(MAX);
SET @sql = '<View Definition>';
EXEC sp_executesql @sql;
如果有的话,使用这种方法有什么陷阱?您会建议哪些替代方案?
我在一个带有 Try catch 块的事务下拥有整个脚本。因此,当没有错误时,脚本将被提交否则回滚。我尝试使用如下 CREATE VIEW 命令,但在引入 TRASACTION 和 TRY-CATCH BLOCKS 后出现错误。这就是为什么要使用动态 SQL 语句 - EXEC sp_executesql .
错误是“创建视图必须是批处理中的唯一语句”
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
【问题讨论】:
-
为什么要使用
dynamic SQL?为什么不使用drop\create或alterview?请记住,drop将放弃对视图的任何授权。 -
其实,我正在删除并重新创建。请阅读,这是在生产数据库中更改视图的标准。不是吗?
-
是的,这是非常标准的过程。但不使用
dynamic SQL。 -
所以你会建议正常的 drop/create 而不是动态 SQL 执行命令?为什么会这样?
-
请在下方查看我的回复
标签: sql sql-server tsql database-schema