sql-server - 返回结果 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];
谢谢,
吉米迪恩
解决方案
你的问题是这些行:
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 1
在SELECT
. 这将始终返回 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
推荐阅读
- c++ - 程序停止而不运行 while 循环
- php - 如何从具有 TABLE_NAMES 的 LIKE 子句的语句中获取 mysql 记录
- android - Android - 其他主题的 FloatingActionButton
- javascript - 从promise.then在子级中触发父级中的setState函数
- go - GoLang 使用 gin 调用函数而不传递 gin.Context
- ios - [UISplitViewController`s master ViewController] 上的 NavigationItem 在 iPad 上消失(iOS 9 / 10)
- c# - 为什么我不能编码 const 结构?
- javascript - Pagiante gem 是否将循环中的计数结果限制为每页数,如何避免?
- android - 不好的做法?多个WebView实现多标签浏览器
- javascript - 从 Function 继承时调用的意外行为