我意识到这是一个非常类似的问题,阻止SSMS使用sp_executesql脚本编写SP?
但是,它们似乎改变了SSMS 2012的行为.
如果您选择了"检查存在"选项,如下所示:

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

这会强制它使用sp_executesql编写CREATE脚本.这是毫无意义的,因为如果DROP刚刚丢弃它,你不需要在CREATE上检查IF NOT EXISTS.
似乎不可能没有另一个.
有任何想法吗?
如果没有动态SQL,则无法执行此操作,因为存储过程必须位于其自己的批处理中.所以你不能说:
IF <some condition>
<start a new batch>
Run Code Online (Sandbox Code Playgroud)
保持同一批次的唯一方法是使用sp_executesql.
如果你将要剧本DROP和CREATE同时,就去做,而不检查对象存在.这会给你:
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/
小智 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)
简而言之,如果脚本引擎认为丢弃并在检查对象存在时一起创建,则不需要将条件放在创建上.
| 归档时间: |
|
| 查看次数: |
11827 次 |
| 最近记录: |