存储过程中的典型执行用法

时间:2016-06-13 10:24:24

标签: sql-server tsql

我正在编写一些存储过程,我正在使用其他一些书面程序作为起始模板(由其他人创建),我注意到' EXECUTE'语句已用于非常简单的查询,如果有一个优势,或者只是他的风格,我只是徘徊。

所以下面的内容类似于我一直在寻找但不是我会如何尝试。

CREATE PROCEDURE [dbo].[uspDeleteItem] (@ItemID varchar(max)) 
AS

BEGIN

  -- checks for existing Data associated with the Item
  if fnItemChildCount(@ItemID) > 0
    begin
      return 1
    end

  execute ('delete tblItems where ID = ' + @ItemID)

END

接下来是我如何考虑这样做。

CREATE PROCEDURE [dbo].[uspDeleteItem] (@ItemID varchar(max)) 
AS

BEGIN

  -- checks for existing Data associated with the Item
  if fnItemChildCount(@ItemID) > 0
    begin
      return 1
    end

  DELETE FROM [dbo].[tblItems]
    WHERE [ID] = @ItemID

END

我不是这里的专家,但是那个写其他SP的人是(显然)所以我只是在徘徊,如果他对我做的事情有一些优势吗?

1 个答案:

答案 0 :(得分:3)

不,通常没有任何优势,它让您对SQL注入持开放态度,并且通过一次性使用计划使计划缓存膨胀。它还可以防止所有权链接,这意味着您必须对基础对象以及过程delete授予exec权限。

这可能会带来轻微好处的一种情况是,如果查询容易受到参数嗅探的影响,但在这种情况下,您可以保留查询参数化并添加option (recompile)以使其编译时考虑实际参数值。无论如何,对于ID列上的单身人士搜索,这不会成为一个问题。

@itemid的数据类型在您的改进版本中仍然看起来很可疑。该参数应具有与列相同的数据类型。