2010-04-22 60 views
1

我想在我的mssql存储过程中使用参数在小的和详细的结果(用于可维护性,性能和网络负载的原因)之间切换。SQL Server - 如何在2个可能的SELECT语句之间切换

如果参数设置为1,我得到所有列,否则只有一个或两个最重要的。 在一个非常有限的方式,它的工作原理是这样的:

ALTER PROCEDURE [dbo].[GetAllUsers] 
@detail BIT 
AS 
IF @detail = 1 SELECT UserName, Title, UserID FROM Users 
ELSE SELECT Username FROM Users 

但我想使用组合的WHEN子句。 以下是我的尝试,但这并不奏效。

ALTER PROCEDURE [dbo].[GetAllUsers] 
@detail BIT 
AS 
CASE @detail 
    WHEN 1 THEN SELECT UserName, Title, UserID 
    ELSE SELECT UserName END 
    FROM Users 
    WHERE UserID < 5 

有什么办法可以达到这样的效果吗?

回答

9

我认为这是可怕的API设计有一个存储过程基于输入变量返回不同的记录类型。我认为你应该创建两个存储过程,GetAllUsersGetAllUsersWithDetails

5

个人而言,我会使用两种不同的存储过程。没有理由创建一个复杂的实现,只是为了强制事物适合一个存储过程。

+0

我也想过这个。所以我想我会把它放在两个。 其中一个原因是,where子句中的更改会影响小版本和详细版本。我期望where子句变得很大,没有这样的'技巧',我有两个大的where子句,在2个存储过程中完全相同。 – Marks 2010-04-22 13:54:56

1

虽然我同意klausbyskov这两个程序是一个更好的设计,我会尽力回答你的问题 - 我恐怕简短的回答是没有

它确实有可能执行两种不同的select语句(这是你有你的第一个代码示例中),这取决于一个变量的值,但它无法改变投影内单以这种方式选择语句。