Sql server 子查询返回了多个值。我做错了什么?

Sql server 子查询返回了多个值。我做错了什么?,sql-server,tsql,Sql Server,Tsql,我有一个存储过程,无法执行它,因为我遇到以下错误: 子查询返回了多个值。这是不允许的,因为 子查询后面是=,!=,=或者当子查询用作 表情 这是发生问题的存储过程的一部分。我在游标中使用了这段代码,只要我理解正确,它就可以一条记录一条记录地工作。记住这一点。我看不出有什么问题 SELECT @Public_amount = (SELECT CASE WHEN cl.[Tram_periodicity] = '1' THEN pca.[5day] -- of 6 dagen, w

我有一个存储过程,无法执行它,因为我遇到以下错误:

子查询返回了多个值。这是不允许的,因为 子查询后面是=,!=,=或者当子查询用作 表情

这是发生问题的存储过程的一部分。我在游标中使用了这段代码,只要我理解正确,它就可以一条记录一条记录地工作。记住这一点。我看不出有什么问题

SELECT @Public_amount = (SELECT
    CASE 
    WHEN cl.[Tram_periodicity] = '1' THEN pca.[5day] -- of 6 dagen, who knows?
    WHEN cl.[Tram_periodicity] = '2' THEN pca.Monthly
        -- According to Marina, trimestriële is never used. This is code '3'
    WHEN cl.[Tram_periodicity] = '4' THEN pca.Yearly
    WHEN cl.[Tram_periodicity] = '5' THEN pca.Railflex
    ELSE NULL
    END
    FROM [TC].[TC_Control_List] AS cl
    LEFT JOIN [TC].[PC_amount] AS pca
    ON cl.CPARC = pca.PC
    WHERE (CAST(@TRAM_DISTANCE AS NUMERIC)>=pca.[FROM] AND CAST(@TRAM_DISTANCE AS NUMERIC)<=pca.till)
    AND pca.Type = 'Public' AND pca.PC = '20000')

错误消息明确表示您的子查询返回多条记录,您需要top 1子句或使用table variable来存储表中的所有行:

SELECT TOP (1) @Public_amount = CASE WHEN cl.[Tram_periodicity] = '1' THEN pca.[5day] -- of 6 dagen, who knows?
                                     WHEN cl.[Tram_periodicity] = '2' THEN pca.Monthly -- According to Marina, trimestriële is never used. This is code '3'
                                     WHEN cl.[Tram_periodicity] = '4' THEN pca.Yearly
                                     WHEN cl.[Tram_periodicity] = '5' THEN pca.Railflex
                                END
 . . . 

然而,这可能不能解决您的实际问题,但可以解决您的编译错误

SQL是不完整的;那个括号永远不会闭合。然而,关于你的错误,你不明白的是什么?该错误是SQL Server中更明显的错误之一。但是,最明显的是,您的子查询返回的行不止一行,并且在=运算符之后。在=运算符之后,子查询只能返回1行或0行。但是,如果不了解您所需的行为,我们将无法进一步具体帮助您。您好,欢迎来到SO。我不知道怎样才能更清楚。您正在为查询结果设置一个变量。显然,该查询返回的行不止一行,因此您会得到该错误消息。单独运行该查询,您将看到它至少返回2行。@HoneyBadger不,它不会。这个查询肯定会导致这个错误。尝试声明@i int=从值1,2 Vi中选择i;您正在考虑语法DECLARE@i int;从值1,2 Vi中选择@i=i;,这会将@i的值设置为返回的最后一个值。如何基于一行中的数据?您所做的只是对@TRAM_DISTANCE进行范围查询。@TRAM_DISTANCE是只产生一行的键吗?显然不是,否则你就不会收到错误消息。我在游标中使用这段代码,只要我理解它是正确的,它就可以一条记录一条记录地工作。是的,也不是。是的,它一行一行地工作,但是如果您想要期望的行为,那么每个值都必须是唯一的。我怀疑你的行为与此非常相似,因此你会出现错误。正如我之前所评论的,我怀疑你甚至需要一个游标,并且你很可能可以编写一个更高效的数据集解决方案。只需注意,TOP 1会给你一个任意的行,它不一定是你想要的。此外,TOP 1需要位于子查询内部,将其放在子查询外部,否则更改OP的代码将导致相同的错误。没有ORDER BY的TOP 1不会提供可靠的行为。@Larnu。这个陈述并不完整,它只是反映了实际问题。顺便说一句,在没有订单的情况下同意前1项。