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