首页 > 解决方案 > 返回结果 SQL 的问题

问题描述

DECLARE @ReturnValue INT
DECLARE @Field1 VARCHAR(50)

SET @Field1 = (SELECT Field1 
               FROM [Workflow Creation].[dbo].[ssFields] 
               WHERE Field1 = 'Gary')

IF @Field1 = 'Gary' OR @Field1 = 'Sarah'
    SET @ReturnValue = '1'
ELSE 
    SET @ReturnValue = '0';

本质上我想返回一个值,然后设置该值。我正在使用程序,这对它返回的内容非常敏感。所以我在 SQL Management Studio 中得到这个错误:

子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。

下面是我之前的内容,它会返回结果,但程序不会获取结果并将其正确分配到我需要这些文件的位置。

SELECT 
    CAST(CASE       
            WHEN Field1 = 'Gary' OR Field1 = 'Sarah'            
               THEN 1                 
               ELSE 0   
         END AS BIT) AS [ReturnValue], 
    * 
FROM 
    [Workflow Creation].[dbo].[ssfields];

谢谢,

吉米迪恩

标签: sql-servertsql

解决方案


你的问题是这些行:

DECLARE @Field1 VARCHAR(50)

SET @Field1 = (SELECT Field1 
               FROM [Workflow Creation].[dbo].[ssFields] 
               WHERE Field1 = 'Gary')

@Field1是一个VARCHAR值(不是TABLE变量),并且您的选择返回多行,因为在表中ssFields有超过 1 行带有Field1 = 'Gary'. 这就是您收到错误消息的原因:

子查询返回超过 1 个值

要解决此问题,您可以TOP 1SELECT. 这将始终返回 0 或 1 行(永远不会更多),并且不会弹出此消息。

DECLARE @Field1 VARCHAR(50)

SET @Field1 = (SELECT TOP 1 Field1                        -- Here
               FROM [Workflow Creation].[dbo].[ssFields] 
               WHERE Field1 = 'Gary')

但是,我相信这实际上是您正在寻找的:

DECLARE @ReturnValue INT
DECLARE @Field1 VARCHAR(50) = 'Gary'

IF EXISTS ( SELECT 'the searched field exists!!'
            FROM [Workflow Creation].[dbo].[ssFields] 
            WHERE Field1 = @Field1)
BEGIN
    SET @ReturnValue = 1 -- Don't use literals if it's a number!
END
ELSE
BEGIN
    SET @ReturnValue = 0 -- Don't use literals if it's a number!
END

推荐阅读