【问题标题】:SQL Server - How to switch between 2 possible SELECT statementsSQL Server - 如何在 2 个可能的 SELECT 语句之间切换
【发布时间】:2010-04-22 13:34:18
【问题描述】:

我想在我的 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

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

【问题讨论】:

    标签: sql stored-procedures select case-statement


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我也想过这个。所以我想我会把它一分为二。一个原因是,where 子句的更改会影响小而详细的版本。我希望 where 子句会变大,并且没有这样的“技巧”,我有两个大的 where 子句,它们在 2 个存储过程中完全相同。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-12-14
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        • 2014-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多