【问题标题】:exec in stored procedure will get the benefits of stored procedure存储过程中的 exec 将获得存储过程的好处
【发布时间】:2011-10-04 06:54:52
【问题描述】:

如果我放东西

DECLARE @Query VARCHAR(8000)

SET @Query = 'select * from  subscriber   
                where sbs_userid = ' + cast(@UserID as varchar) + '
          and SBS_Status in (select statusFlag from #tmpStatusFlag) 
          and SBS_SourceFlag  in (select sourceFlag from #tmpSourceFlag)' 

IF (@FirstName !='')
    SET @Query = @Query + ' and  SBS_FirstName like ''%' + @FirstName + '%'''
IF(@LastName !='')
   SET @Query = @Query + ' and  SBS_LastName like ''%' + @LastName + '%'''
IF(@Phone !='')
   SET @Query = @Query + ' and  SBS_WorkPhone like ''%' + @Phone + '%'''
IF(@EmaiAdderess !='')
   SET @Query = @Query + ' and  SBS_EmailAddress like ''%' + @EmaiAdderess + '%'''
 IF(@City !='')
   SET @Query = @Query + ' and  SBS_City like ''%' + @City + '%'''   
IF(@SubListId !='-1')
   SET @Query = @Query + ' and  SBS_SubListId like ''%' + @SubListId + '%'''


SET @Query = @Query + ' order by SBS_CreationDate desc'

EXEC (@Query)

在我的存储过程中。

我的问题仍然是我得到了存储过程的好处还是这是一种错误的方法

我从不使用它,但我的团队负责人使用它来加快存储过程。可以吗?

已编辑

如果我们使用 sp_executesql 而不是 exec 那么我们可以利用存储过程的好处。这样可以吗?

【问题讨论】:

  • 目前这看起来很容易受到 SQL 注入攻击。

标签: sql sql-server-2005 stored-procedures execute


【解决方案1】:

没有。

您需要使用EXEC sp_executesql 来获得参数化的优势(计划重用 - 防止 SQL 注入)。

无论如何,这些领先的通配符搜索都会很昂贵。您是否考虑过全文索引?

修改后

如果我们使用sp_executesql 而不是exec,那么我们可以从中受益 存储过程。这样可以吗?

不是全部存储过程的好处。与sp_executesql 相比,存储过程仍然具有的几个优点是您可以使用所有权链接,并且只需要授予exec 对存储过程的权限,而不是select 对底层对象的权限。此外,使用静态存储过程而不是动态 SQL 字符串可以在重构数据库时更容易找到依赖对象。

但是,在您的情况下,对于 6 个可选参数的存在/不存在的每种组合,您需要 64 个单独的过程,并且随着更多可选参数的添加,这个数字会呈指数增长。

请参阅Dynamic Search Conditions in T-SQL Version for SQL 2005 and Earlier 了解有关此主题的详细讨论。

【讨论】:

    猜你喜欢
    • 2017-09-18
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2023-03-07
    • 2013-01-21
    • 2013-01-05
    • 2018-03-04
    • 2012-06-15
    相关资源
    最近更新 更多