我正在编写一些存储过程,我正在使用其他一些书面程序作为起始模板(由其他人创建),我注意到' 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的人是(显然)所以我只是在徘徊,如果他对我做的事情有一些优势吗?
答案 0 :(得分:3)
不,通常没有任何优势,它让您对SQL注入持开放态度,并且通过一次性使用计划使计划缓存膨胀。它还可以防止所有权链接,这意味着您必须对基础对象以及过程delete
授予exec
权限。
这可能会带来轻微好处的一种情况是,如果查询容易受到参数嗅探的影响,但在这种情况下,您可以保留查询参数化并添加option (recompile)
以使其编译时考虑实际参数值。无论如何,对于ID列上的单身人士搜索,这不会成为一个问题。
@itemid
的数据类型在您的改进版本中仍然看起来很可疑。该参数应具有与列相同的数据类型。