【问题标题】:SQL Server Case statement does not work in Delphi TADODataSetSQL Server Case 语句在 Delphi TADODataSet 中不起作用
【发布时间】:2015-08-24 09:37:07
【问题描述】:

在 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 视图,因为我使用了动态查询)

【问题讨论】:

  • 从 Sql Server Management Studio(或 Query Analyzer,如果它是旧的服务器版本)执行 Sql 是否正常工作?案例语句通常可以通过 Delphi 中的 Ado 数据集正常工作..
  • @JensBorrisholt,不,我通过将 Case 块转换为 View 并左加入它来解决问题,同时我已经使用 FireDAC 组件测试了这个 SQL 语句并且它有效。在我看来,ADO 组件中 Case 中的 Select 语句不起作用。
  • 无论如何,整个 case 表达式有点不对劲。您有前 1 个但没有排序依据。此外,您似乎正在使用此子选择作为进行存在检查的一种方式。左连接在这里会更合适和更高效。
  • 实际上,CASE 与 ADO 配合得很好。也许参数是问题/错误。
  • 我的意思是,用TADODataSet.ParamCheck := False 试试这个命令,不要用:Fk 作为参数...

标签: sql-server delphi ado


【解决方案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似乎改变了执行计划的优先级……!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2016-07-08
    • 2018-07-23
    • 1970-01-01
    相关资源
    最近更新 更多