1

我想在我的 mssql 存储过程中使用一个参数来在小结果和详细结果之间切换(出于可维护性、性能和网络负载的原因)。

如果参数设置为 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

有没有办法实现这样的目标?

4

3 回答 3

9

我认为让存储过程根据输入变量返回不同的记录类型是糟糕的 API 设计。我认为您应该创建两个存储过程,GetAllUsers并且GetAllUsersWithDetails.

于 2010-04-22T13:39:13.483 回答
5

就个人而言,我会使用两个不同的存储过程。没有理由仅仅为了强迫事物适应一个存储过程而创建一个复杂的实现。

于 2010-04-22T13:39:15.463 回答
1

虽然我同意klausbyskov的观点,即两个程序是更好的设计,但无论如何我都会尝试回答您的问题 - 恐怕简短的回答是否定的。

根据变量的值,确实可以执行两个不同的select 语句(这是您在第一个代码示例中所拥有的),但是不可能以这种方式更改单个 select 语句中的投影。

于 2010-04-22T13:45:33.267 回答