2014-01-07 30 views
1

选中所有行或特定行我用下面的存储过程来自同一个存储过程

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存在?

回答

5

NULL一个明确的比较应该工作以及:

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

演示上sqlfiddle:[链接](http://www.sqlfiddle.com/#!6/5e30f/8) – dasblinkenlight

+0

谢谢你你的答案是dasblinkenlight,那么使用Coalesce函数可以更有效吗?我在问最初的问题,因为我刚刚学习了合并语句来运行插入/更新,并想知道是否有类似的方法来使我的选择更有效。 – Mario

+0

@Mario我更喜欢显式'IS NULL'的方式,以获得更好的可读性,而不是任何性能增益。尽管查询优化器更有可能通过明确的'NULL'检查来发现与'COALESCE'相比的情况,很可能性能将保持不变。如果'States'代表美国的状态,也就是说,如果它是一个50行的表格,则全表扫描可能与索引查找效率一样高,因为表格非常小​​。您可能想查看查询计划以查看优化器正在执行的操作。 – dasblinkenlight

相关问题