如何使用sp_executesql阻止SSMS 2012编写SP脚本

Chr*_*isA 21 sql-server ssms

我意识到这是一个非常类似的问题,阻止SSMS使用sp_executesql脚本编写SP?

但是,它们似乎改变了SSMS 2012的行为.

如果您选择了"检查存在"选项,如下所示:

在此输入图像描述

...它现在为即将创建的proc生成一个IF NOT EXISTS,以及前一个drop proc的IF EXISTS,如果像我通常那样选择DROP和CREATE选项:

在此输入图像描述

这会强制它使用sp_executesql编写CREATE脚本.这是毫无意义的,因为如果DROP刚刚丢弃它,你不需要在CREATE上检查IF NOT EXISTS.

似乎不可能没有另一个.

有任何想法吗?

Aar*_*and 9

如果没有动态SQL,则无法执行此操作,因为存储过程必须位于其自己的批处理中.所以你不能说:

IF <some condition>
  <start a new batch>
Run Code Online (Sandbox Code Playgroud)

保持同一批次的唯一方法是使用sp_executesql.

如果你将要剧本DROPCREATE同时,就去做,而不检查对象存在.这会给你:

DROP PROCEDURE ...;
GO
CREATE PROCEDURE ...;
GO
Run Code Online (Sandbox Code Playgroud)

谁在乎是否DROP失败?(它不应该,因为你只是从它编写脚本!)

如果您正在为另一个可能具有该对象的系统编写脚本,那么您将收到错误消息DROP,但它CREATE仍然会发生,因此您可以忽略这些DROP错误.如果你真的想要你可以手动包装DROP语句,TRY/CATCH但我不认为这是必要的.

如果您需要为很多程序执行此操作,或者您确实需要该过程不会产生良性错误,我建议您放弃Management Studio的原始脚本选项并使用第三方工具.他们已经处理了许多你尚未遇到的问题,但是会.我在博客上写道:

http://bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/

  • 是的,我对措辞没有打扰.这是事实,如果我想要IF EXISTS(以防止DROP错误),我也被迫在创建上有IF NOT EXISTS,这反过来又强制创建sp_executesql的参数,我也不知道不想要 - 因为任何无意的错别字都不会产生明显的错误.之前很好 - 默认情况下,IF EXISTS存在,而且我没有打开IF NOT EXISTS.在*不*让IF EXISTS成为一个单独的选项,对我来说现在比使用SQL08更糟糕了. (3认同)

小智 5

您可以获得最接近此功能的工具,选项,SQL Server对象资源管理器,脚本,然后将Check for Object Existing设置为false.

缺点是如果你这样做,那么即使对象不存在,drop和created也会一直尝试丢弃.理想的解决方案是一个设置,允许您的脚本看起来像下面的示例,用于创建视图,过程和用户​​定义的函数.

/****** Object:  View [dbo].[vEmployees]    Script Date: 9/14/2012 9:18:57 AM ******/
IF  EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vEmployees]'))
DROP VIEW [dbo].[vEmployees]
GO

CREATE VIEW [dbo].[vEmployees]
AS
    SELECT DISTINCT
        Employees.EmployeeID,
        FirstName,
        LastName
    from
        Employees
            JOIN Sales on Employees.EmployeeID=Sales.EmployeeID
GO
Run Code Online (Sandbox Code Playgroud)

简而言之,如果脚本引擎认为丢弃并在检查对象存在时一起创建,则不需要将条件放在创建上.