SQL Server的Case语句在Delphi TADODataSet中无法工作

4
在Delphi XE5中,我使用TADODataSet并将其CommandText设置为此命令(带有CASE):
SELECT 
    Master.*,
    CASE
       ( SELECT TOP (1) personeli_State 
         FROM Detail 
         WHERE Detail.FK_Key = Master.pk_key 
           AND Detail.personeli_State = 'Test' 
           AND Detail.sended = 0 ) 
       WHEN 'Test' THEN 'Test exist'
       ELSE '' 
     END AS PersonState
FROM   
    Master
LEFT OUTER JOIN 
    ExtraInfo ON ExtraInfo.p_key = Master.fk_ExtraInfo
WHERE  
    (fk_key=:Fk)

记录集为空,但没有CASE语句时,记录集有数据。(我不能使用计算列或SQL Server视图,因为我必须使用动态查询)

1
当在Sql Server Management Studio(或Query Analyzer,如果是旧版本服务器)中执行Sql时,它是否能正常工作?在Delphi中,Case语句通常可以通过Ado数据集正常工作。 - MartynA
1
@JensBorrisholt,不,我通过将Case块转换为View并同时进行左连接来解决了这个问题,与此同时,我使用FireDAC组件测试了这个SQL语句,并且它可以工作。在我看来,在ADO组件中的Case中的Select语句是无法工作的。 - Mohamad
3
整个case表达式有点不对劲。你有top 1但没有order by。此外,似乎你正在使用这个子查询作为执行存在性检查的方法。在这里使用左连接会更合适和有效率。 - Sean Lange
1
实际上,CASE 与 ADO 配合得很好。也许参数是问题/错误所在。 - kobik
1
我的意思是,尝试使用TADODataSet.ParamCheck := False命令,并且不要将:Fk作为参数使用... - kobik
显示剩余12条评论
1个回答

1
将CASE语句中的Select部分更改为以下内容:
    CASE
       ( SELECT TOP (1) personeli_State 
         FROM Detail 
          WHERE Detail.personeli_State = 'Test' 
           AND Detail.sended = 0
           AND Detail.FK_Key = Master.pk_key ) 

在我看来,ADO似乎改变了执行计划的优先级...!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接