Sql 从同一存储过程中选择所有行或特定行

Sql 从同一存储过程中选择所有行或特定行,sql,sql-server-2008,Sql,Sql Server 2008,我使用以下存储过程 CREATE PROCEDURE [dbo].[GetStates] ( @p_StateId int = NULL ) AS SELECT StateId AS CodeID, StateName AS CodeName FROM States WHERE StateID = COALESCE(@p_StateID, StateID) 如果@p_StateId为空,则返回所有行;如果不为空,则

我使用以下存储过程

CREATE PROCEDURE [dbo].[GetStates]
(
    @p_StateId int = NULL
)
AS
   SELECT 
      StateId AS CodeID,
      StateName AS CodeName
   FROM 
      States
   WHERE 
      StateID = COALESCE(@p_StateID, StateID)
如果
@p_StateId
为空,则返回所有行;如果不为空,则如果
StateId
匹配,则返回一行


我的问题是,使用SQL Server 2008是否有一种更优雅的方法来实现这一点?

NULL
进行明确比较也应该有效:

SELECT StateId AS CodeID,
       StateName AS CodeName
FROM States
WHERE @p_StateID IS NULL OR StateID = @p_StateID

NULL
的显式比较也应该有效:

SELECT StateId AS CodeID,
       StateName AS CodeName
FROM States
WHERE @p_StateID IS NULL OR StateID = @p_StateID

感谢您的回答dasblinkenlight,这种方法比使用合并函数更有效吗?我问的是原来的问题,因为我刚刚学习了Merge语句来运行Insert/Update,我想知道是否有类似的方法可以使我的select更有效。@Mario我更喜欢显式
为NULL的方法,这样可以稍微提高可读性,而不是任何性能增益。尽管查询优化器更可能通过显式的
NULL
检查而不是
COALESCE
检查了解情况,但性能很可能保持不变。如果
States
表示美国各州,也就是说,如果它是一个50行的表,那么完整的表扫描可能与索引查找一样有效,因为该表非常小。您可能希望查看查询计划以了解优化器正在做什么。感谢您的回答DasLinkenLight,这种方法比使用Coalesce函数更有效吗?我问的是原来的问题,因为我刚刚学习了Merge语句来运行Insert/Update,我想知道是否有类似的方法可以使我的select更有效。@Mario我更喜欢显式
为NULL的方法,这样可以稍微提高可读性,而不是任何性能增益。尽管查询优化器更可能通过显式的
NULL
检查而不是
COALESCE
检查了解情况,但性能很可能保持不变。如果
States
表示美国各州,也就是说,如果它是一个50行的表,那么完整的表扫描可能与索引查找一样有效,因为该表非常小。您可能希望查看查询计划以了解优化器正在做什么。