当我手动生成sql架构创建脚本时,我通常只调用'Create Procedure ...',但是我注意到当你使用Tasks / Generate Scripts选项生成脚本时,它使用'spexecutesql @statement = ..',例如
EXEC dbo.sp_executesql @statement = N'-- =============================================
-- Author: Me
-- Create date: 20/03/2009
-- Description: Does stuff
-- =============================================
CREATE PROCEDURE [dbo].[MyProc]
-- Add the parameters for the stored procedure here
@StartDate datetime
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
...
END
'
这是为什么?是保留评论吗? 感谢
答案 0 :(得分:20)
它与评论无关。只有当你告诉它“包括IF NOT EXISTS”时才会这样做。原因是它只能以编程方式包含或排除对象,如果它们是动态执行的。
您可以通过在Options \ SQL Server Object Explorer \ Scripting中选择“False”来禁用此存储过程 - 检查对象是否存在。
答案 1 :(得分:4)
我意识到这已经过时了,但修复程序在Sql 2012中深深埋藏.Michael Haren是对的,当选项中需要对象存在性检查时,渲染sprocs的方法会发生变化。要更改此设置,请转到“选项”,“Sql Server对象资源管理器”,“脚本”,“对象脚本选项”,然后将“检查对象存在”设置为false。 Sprocs现在呈现'正常',而不使用sp_executesql。
答案 2 :(得分:3)
sql server 2012,设置工具=>选项=> SQL Server对象浏览=>脚本,检查对象存在=假
可以解决这个问题。
答案 3 :(得分:0)
我猜它可以在没有GO的同一个脚本文件中创建多个sprocs吗?如果直接创建sproc ...,则必须批量完成(使用GO完成)。使用sp_executesql,您不必在对象之间生成脚本。虽然我不记得了,但也许那里有一个..(在我面前没有一个数据库)。
答案 4 :(得分:0)
使用spexecutesql是一种最佳实践。通过隔离/限制变量的范围等来防止sql注入等。更多信息,请访问:http://msdn.microsoft.com/en-us/library/ms188001.aspx
你没有必须使用spexecutesql - EXEC也有效 - 很多人只使用普通的旧EXEC - 它只是不安全。