为什么sql server使用带字符串的sp_executesql语句生成存储过程?

时间:2009-05-07 23:55:25

标签: sql-server

当我手动生成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
'

这是为什么?是保留评论吗? 感谢

5 个答案:

答案 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 - 它只是不安全。