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行的表,那么完整的表扫描可能与索引查找一样有效,因为该表非常小。您可能希望查看查询计划以了解优化器正在做什么。