You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CASE WHEN EXISTS语句未正确显示预期Ongoing状态求助

解决CASE WHEN EXISTS判断状态异常的问题

我太懂你这种糟心感受了——明明确认有数据库的is_trustworthy_on设为1,结果执行语句后状态却显示成了Completed,而非预期的Ongoing,而且同款逻辑在其他语句里都正常,这次偏偏掉链子。咱们来一步步把问题揪出来。

先看你写的这段代码:

declare @STIG varchar(255)
SET @STIG = 'MS SQL Server 2016 Database'
declare @STIG1 varchar(255)
SET @STIG1 = 'MS SQL Server 2016 Instance'
DECLARE @VID2 varchar(20)
set @VID2 = 'V-71'
CREATE TABLE #temp2 ([DatabaseName] varchar(100), [DatabaseOwner] varchar(100), [is_trustworthy_on] varchar(5))
INSERT INTO [#temp2] (DatabaseName, DatabaseOwner, is_trustworthy_on)
SELECT name as DatabaseName, SUSER_SNAME(owner_sid) AS DatabaseOwner, is_trustworthy_on FROM sys.databases
SELECT @@servername as [HostName], @VID2 as [V-ID], @STIG AS [STIG],
(CASE WHEN EXISTS (
SELECT is_trustworthy_on FROM #temp2 WHERE #temp2.is_trustworthy_on = 0)
Then CAST('Completed' AS varchar(12))
ELSE CAST ('Ongoing' AS varchar(12)) END) as [Status]
drop table #temp2

问题根源:逻辑判断完全搞反了!

你当前的CASE条件是判断是否存在is_trustworthy_on = 0的记录,如果存在就返回Completed。但SQL Server的系统库(比如master、model)默认is_trustworthy_on就是0,所以你的临时表#temp2里必然有这类记录,条件直接成立,自然就返回Completed了——完全忽略了有没有值为1的记录。

而你的实际需求是:当存在is_trustworthy_on = 1的记录时,显示Ongoing,否则才显示Completed。

修正后的代码

把EXISTS的判断条件和CASE的分支逻辑反过来就搞定了,另外还有个小细节要注意:

declare @STIG varchar(255)
SET @STIG = 'MS SQL Server 2016 Database'
declare @STIG1 varchar(255)
SET @STIG1 = 'MS SQL Server 2016 Instance'
DECLARE @VID2 varchar(20)
set @VID2 = 'V-71'
CREATE TABLE #temp2 ([DatabaseName] varchar(100), [DatabaseOwner] varchar(100), [is_trustworthy_on] varchar(5))
INSERT INTO [#temp2] (DatabaseName, DatabaseOwner, is_trustworthy_on)
SELECT name as DatabaseName, SUSER_SNAME(owner_sid) AS DatabaseOwner, is_trustworthy_on FROM sys.databases
SELECT @@servername as [HostName], @VID2 as [V-ID], @STIG AS [STIG],
(CASE WHEN EXISTS (
SELECT is_trustworthy_on FROM #temp2 WHERE #temp2.is_trustworthy_on = '1') -- 因为字段是varchar类型,这里加上单引号更稳妥
Then CAST('Ongoing' AS varchar(12)) -- 存在值为1的记录时返回Ongoing
ELSE CAST ('Completed' AS varchar(12)) END) as [Status] -- 所有记录都是0时才返回Completed
drop table #temp2

这样修改后,只要你的数据库里有任何一个is_trustworthy_on为1的记录,就会返回你预期的Ongoing状态了。

内容的提问来源于stack exchange,提问作者J T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:57:21