返回结果SQL的问题

时间:2018-09-05 14:34:19

标签: sql-server tsql

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中收到此错误:

  

子查询返回了多个值。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。

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

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

谢谢

JimmyDean

2 个答案:

答案 0 :(得分:2)

您的问题是这些行:

DECLARE @Field1 VARCHAR(50)

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

@Field1是一个VARCHAR值(不是TABLE变量),并且您的选择返回了多行,因为在表ssFields中,{{ 1}}。这就是为什么您收到错误消息的原因:

  

子查询返回了多个值

要解决此问题,您可以在Field1 = 'Gary'内使用TOP 1。这将始终返回0或1行(并且永远不会再返回),并且该消息不会弹出。

SELECT

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

DECLARE @Field1 VARCHAR(50)

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

答案 1 :(得分:0)

出现该错误的原因是,您只能将一项分配给@ Field1变量。 SQL Server认为您正在尝试将多个nvarchar分配给同一个@ Field1变量。解决问题的方法如下:

DECLARE @ReturnValue INT
DECLARE @Field1 VARCHAR(50)

SET @Field1 = (SELECT TOP 1 Field1 
               FROM YourTable
               WHERE Field1 = 'Gary')

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

SELECT @ReturnValue --will be 1

使用SELECT TOP 1 Field1 FROM YourTable时,您明确告诉SQL Server获取返回的最高记录,并将Field1的Column结果分配给变量@ Field1。

如果要捕获多个结果,则可以使用临时表来完成:

CREATE TABLE #Field1s (
    Id INT PRIMARY KEY IDENTITY (1,1),
    IsGaryOrSarah BIT NOT NULL
)

INSERT INTO #Field1s
SELECT CASE WHEN Field1 = 'Gary' THEN 1
            WHEN Field1 = 'Sarah' THEN 1
            ELSE 0 END
FROM YourTable
SELECT * FROM #Field1s

但是,如果要在工作流中基于结果进行某些操作,则几乎可以肯定要从应用程序代码中进行操作。您可以从应用程序中查询表,并且可以使用针对该任务设计的语言更轻松地实现条件逻辑工作流。