SQL Server 根据参数返回不同查询的函数

unftdfkk  于 2023-01-25  发布在  其他
关注(0)|答案(1)|浏览(147)

我有各种各样的相同的查询遍布我的项目,这是一个地狱维护。所以我想重新组织他们都在一个地方。我是新的数据库编程,所以请原谅我,如果我的想法是完全错误和荒谬的:D
我试过这样的方法:

CREATE OR ALTER FUNCTION GetResults
(
    @Parameter1 int
)
RETURNS TABLE
AS
RETURN
(
    WITH
        Query1 AS (SELECT * FROM dbo.a WHERE ConditionsX),
        Query2 AS (SELECT * FROM dbo.a WHERE ConditionsY),
        Query3 AS (SELECT * FROM dbo.a WHERE ConditionsZ)
    SELECT CASE
        WHEN @Parameter1 = 1 THEN (SELECT * FROM Query1)
        WHEN @Parameter1 = 2 THEN (SELECT * FROM Query2)
        WHEN @Parameter1 = 3 THEN (SELECT * FROM Query3)
    END
)
GO

可悲的是,我得到一个执行错误时,运行这是不是真的很清楚我:
如果未使用EXISTS引入子查询,则只能在选择列表中指定一个表达式。

f4t66c6m

f4t66c6m1#

注解中提到,CASE返回一个标量值,所以它 * 不能 * 返回SELECT * FROM...的结果,因为它(很可能)返回多个列 * 和 * 行;它不是一个标量值。
更有可能的是,您应该做的是UNION (ALL) ing您的数据集,并在其中有一个WHERE,所以只返回您感兴趣的:

CREATE OR ALTER FUNCTION dbo.GetResults (@Paramater1 int)
RETURNS TABLE AS
RETURN
    SELECT <Explicit Column List, do not use *>
    FROM dbo.a
    WHERE ConditionsX
      AND @Parameter1 = 1
    UNION ALL
    SELECT <Explicit Column List, do not use *>
    FROM dbo.a
    WHERE ConditionsY
      AND @Parameter1 = 2
    UNION ALL
    SELECT <Explicit Column List, do not use *>
    FROM dbo.a
    WHERE ConditionsZ
      AND @Parameter1 = 3;
GO

虽然这仍然有XY Problem的味道,如果我诚实的话,我怀疑你试图解决的问题和你给我们展示的问题不是一个相同的问题,尽管你需要问一个new question来问这个问题。

相关问题