1

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

伪代码

@tempSelect = "SELECT * FROM Table"

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

这种方法有效吗?谢谢你。

4

5 回答 5

10

尝试

select *
from table
where id=isnull(@param, id)
于 2009-03-18T16:33:26.463 回答
1

Select * from Table where (ID = @Param or @Param is null)

或者

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

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

于 2009-03-18T16:34:11.610 回答
0

是的——我当然认为它没有任何问题。你可以让它变得更简单:

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

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

于 2009-03-18T16:35:42.137 回答
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 生成的查询计划与不使用 OR 生成的查询计划相比,您就会明白为什么。

于 2009-03-21T20:18:01.697 回答
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
于 2014-03-28T02:24:33.033 回答