首页 > 解决方案 > 如何在存储过程中模拟 SELECT 中的多行?

问题描述

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

我目前正在测试一个非常小的 API,它使用 SQL Server 数据库中的数据。为了测试它,我使用了一个“模拟”一行并返回它的存储过程。像这样:

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

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

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

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;

但这会返回多个“NAME”列。

如何返回多行?我正在使用 SQL Server。

标签: sql-server-2008stored-procedures

解决方案


我们需要使用VALUES表构造函数,基本上是一个内联的“发明”表,请参阅相关文档
它也可以完成,UNION ALL但更冗长。

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

推荐阅读