SQL存储过程:条件返回

时间:2009-03-18 16:31:26

标签: sql stored-procedures branch

您好我想创建一个简单的存储proecudre,它执行以下操作:

Psudocode

@tempSelect = "SELECT * FROM Table"

if (@Param is NULL) then
 exec @tempSelect
else
 exec @tempSelect + ' WHERE id = ' + @Param + '

这种方法有效吗?谢谢。

5 个答案:

答案 0 :(得分:10)

尝试

select *
from table
where id=isnull(@param, id)

答案 1 :(得分:1)

从表中选择* Where(ID = @Param或@Param为null)

或者

从表中选择* 其中ID = Coalesce(@Param,ID)

[如果您的目标是提高效率,请将*替换为您想要返回的特定字段。]

答案 2 :(得分:0)

是的 - 我当然没有看到它有任何问题。你可以让它变得更简单:

Set NOCOUNT On;
if (@Param is NULL) 
   Select * From Table;
else 
   Select * From Table Where (ID=@Param);

注意:我可能会拼出这些字段。

答案 3 :(得分:0)

根据具体情况,我可能会使用动态SQL。

但是,如果@param来自用户,你需要记住SQL注入,这就是为什么你不应该直接向你的sql添加参数。

在t-sql中,它看起来像是(从我的头脑中未经测试;):

DECLARE @SQL NVARCHAR(MAX)

SET @SQL = N'
  SELECT ...
  FROM   table t
  WHERE  1 = 1' (

IF(@param IS NOT NULL)
  SET @SQL = @SQL + '
    AND t.id = @id'

... possibly more things added to the query ...

EXEC sp_executesql 
   @SQL
, '@id AS INT'
,  @id = @Param

通过这样做,您将获得针对每种情况的优化查询计划(并且通过使用sp_executesql,也将使用查询缓存)

我会特别避免使用OR解决方案,如果你检查使用OR生成的查询计划与没有生成的查询计划相比,你会理解为什么。

答案 4 :(得分:0)

试试这段代码:

CREATE PROCEDURE [dbo].[ProcedureName]
@Param varchar(50)

AS
BEGIN

declare @tempSelect nvarchar(max)  

SET NOCOUNT ON;

set @tempSelect = 'SELECT Col1, Col2 FROM Table where Col1 <> '' '

         if @Param <> '' 
    begin
    set @resultSet = @resultSet +  ''' and Col1='''+@Param1 
    end


EXEC(@resultSet)

END