2011-10-04 71 views
3

的好处,如果我把东西EXEC在存储过程中会得到存储过程

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) 

在我的存储过程。

我的问题仍然是我得到的存储过程的好处,或者是一种错误的做法

我从来没有使用这一点,但我的团队负责人用它来加快存储proceure。可以吗?

EDITED

如果我们使用sp_executesql的的代替EXEC那么我们可以利用存储procedure.and的好处是这样确定这个?

+2

这看起来很容易受到SQL注入攻击。 –

回答

4

您需要使用EXEC sp_executesql得到参数化的优势(计划重用 - 保护免受SQL注入)。

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

继编辑

如果我们使用sp_executesql代替exec那么我们可以采取的好处存储procedure.and的 这是正确的这件事?

不是全部存储过程的好处。存储过程仍然会优于sp_executesql的一些优点是,您可以使用所有权链接,并且只需授予对存储过程的exec权限而不是基础对象上的select。此外,使用静态存储过程而不是动态SQL字符串可以使重构数据库时更容易找到依赖对象。

然而,在您的情况下,对于6个可选参数,每个存在/不存在组合需要64个独立的过程,并且随着更多可选参数的添加,此数字将呈指数增长。

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