2017-05-30 60 views
0

我在SQL Server Mgmt Studio中保持“检查对象是否存在”选项打开,因为我需要SQL Server自动包含“IF EXISTS“语句,然后再删除和重新创建对象。当对象存在检查打开时,为SQL对象生成静态SQL脚本而不是动态SQL

现在,无论何时我右键单击并尝试为任何对象生成“创建和删除脚本”,它都会将整个CREATE语句作为动态SQL,我认为这是一个纯粹的混乱,并且更容易出错。

当打开对象存在检查时,是否有任何选项可以使SSMS生成静态SQL脚本?

我使用SSMS 2012

+0

有很多关于SO问的问题,为什么SQL Server在'如果不存在/创建'块时会“忽略”IF。例如。 [这里](https://stackoverflow.com/q/120966/15498),都有相同的解释 - 当*编译* CREATE时,SQL Server会抛出一个错误,因为对象已经存在。所以另一种方法是,没有动态SQL,就是让脚本产生错误。你确定你想要吗? –

+1

SQL Server 2016既有'Drop If Exists'也有'CREATE OR ALTER',但这并不能帮助你,因为你在2012年。这里的问题是'CREATE'必须是批量中唯一的批量对象类型,所以这是做到这一点的唯一方法。 –

回答

0

如果我理解正确的话,这是正确的/最好的办法......

的问题是,有在T-SQL没有DROP_AND_CREATE声明。很多人使用类似

IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME='SomeFunction') 
    DROP FUNCTION dbo.SomeFunction; 
GO 
CREATE FUNCTION dbo.SomeFunction... 

但是,这是有问题的,如果有像CONSTRAINTGRANT或其他依赖...

这是比较容易使用上面的检查等,如果你决定创建CREATE声明或者如果您将第一个词动态更改为ALTER。您不能将这两个语句放在某种条件工作流中,因为它必须是第一批

...纯混乱,更容易产生错误

特别是与生成的语句我不希望错误...你是对的,这是不漂亮,但很多代码生成器不生产相当码。这并不重要......