如何在存储过程中模拟 SELECT 中的多行?

How to mock multiple rows in a SELECT in a stored procedure?

这可能是一个愚蠢的问题,但我已经尝试了几种方法,但无法获得我想要的结果。

我目前正在测试一个非常小的 API,它使用来自 SQL 服务器数据库的数据。为了测试它,我正在使用一个存储过程来“模拟”一行并 returns 它。像这样:

CREATE PROCEDURE ONE
    (@FRUITCODE VARCHAR(12))
AS
BEGIN
    SET NOCOUNT ON;

    SELECT
        'BANANA' as NAME
    WHERE 
        @FRUITCODE > 0;
END;

这可以很好地模拟一行,但我想 return 更多这样的行:

NAME
---------
BANANA
STRAWBERRY
MELON

我试过了

CREATE PROCEDURE TWO
    (@FRUITCODE VARCHAR(12))
AS
BEGIN
    SET NOCOUNT ON;

    SELECT
        'BANANA', 'STRAWBERRY', 'MELON' AS NAME
    WHERE @FRUITCODE > 0;
END;

但这会产生多个列,一个是 NAME,其他的列名称为空。

我也试过了

CREATE PROCEDURE THREE
    (@FRUITCODE VARCHAR(12))
AS
BEGIN
    SET NOCOUNT ON;

    SELECT 'BANANA' AS NAME
    WHERE @FRUITCODE > 0;

    SELECT 'STRAWBERRY' AS NAME
    WHERE @FRUITCODE > 0;

    SELECT 'MELON' AS NAME
    WHERE @FRUITCODE > 0;
END;

但这会生成单独的“表格”,而不是一个包含多行的表格。

最后我试过了

CREATE EPROCEDURE FOUR
    (@FRUITCODE VARCHAR(12))
AS
BEGIN
    SET NOCOUNT ON;

    SELECT
        'BANANA' AS NAME,
        'STRAWBERRY' AS NAME,
        'MELON' AS NAME
    WHERE @FRUITCODE > 0;
END;

但这 return 有多个“NAME”列。

我怎样才能 return 多行?我正在使用 SQL 服务器。

我们需要使用 VALUES table 构造函数,基本上是一个内联 'invented' table,请参阅 docs
它也可以用 UNION ALL 来完成,但那样更冗长。

SELECT *
FROM (VALUES
        ('BANANA'),
        ('STRAWBERRY'),
        ('MELON')
) AS v (NAME)
WHERE @FRUITCODE > 0