协助访问ADP和/或SQL iif语句

协助访问ADP和/或SQL iif语句,sql,sql-server,access-data-project,Sql,Sql Server,Access Data Project,我使用Access ADP作为SQL的前端。我有两张桌子: 一个是2018年的价格 一个是2020年的价格 我想从2018年价格表或2020年价格表中选择价格,具体取决于购买日期。我首先尝试将IiF语句放入查询设计器: Iif ([Purchase_Date] < Convert(DateTime, '2020-01-01 00:00:00'),[Price_2018],[Price_2020]) 在Access中运行时,会显示错误消息:“由于使用SQL Server后端(从MS A

我使用Access ADP作为SQL的前端。我有两张桌子:

  • 一个是2018年的价格
  • 一个是2020年的价格
我想从2018年价格表或2020年价格表中选择价格,具体取决于购买日期。我首先尝试将IiF语句放入查询设计器:

Iif ([Purchase_Date] < Convert(DateTime, '2020-01-01 00:00:00'),[Price_2018],[Price_2020])
在Access中运行时,会显示错误消息:“由于使用SQL Server后端(从MS Access 2013起不再受支持),您必须使用其TSQL方言,该方言支持
IIF
(或
CASE
),并且可以在不进行转换的情况下将日期与字符串表示形式进行比较

下面我将扩展到假设不同列的fuller查询。根据需要调整:

SELECT
  ...
  IIF(t.[Purchase_Date] < '2020-01-01', p18.price, p20.price)
  ...
FROM [Transactions] t
INNER JOIN [Price_2018] p18
  ON t.price_id = p18.price_id
INNER JOIN [Price_2020] p20
  ON t.price_id = p20.price_id
选择
...
IIF(t[购买日期]<'2020-01-01',第18页价格,第20页价格)
...
来自[交易]t
内部连接[Price_2018]p18
在t.price\u id=p18.price\u id上
内部连接[Price_2020]p20
在t.price\u id=p20.price\u id上
由于使用SQL Server后端(从MS Access 2013起不再受支持),您必须使用其TSQL方言,该方言支持
IIF
(或
CASE
),并且可以在不转换的情况下将日期与字符串表示形式进行比较

下面我将扩展到假设不同列的fuller查询。根据需要调整:

SELECT
  ...
  IIF(t.[Purchase_Date] < '2020-01-01', p18.price, p20.price)
  ...
FROM [Transactions] t
INNER JOIN [Price_2018] p18
  ON t.price_id = p18.price_id
INNER JOIN [Price_2020] p20
  ON t.price_id = p20.price_id
选择
...
IIF(t[购买日期]<'2020-01-01',第18页价格,第20页价格)
...
来自[交易]t
内部连接[Price_2018]p18
在t.price\u id=p18.price\u id上
内部连接[Price_2020]p20
在t.price\u id=p20.price\u id上

ADP是一种优秀的RAD(快速应用程序开发)工具,可惜它们被弃用了。您是否能够在SQL数据库中创建一个视图,以满足您的需要。然后你可以在你的ADP中引用它。听起来你确实有一些数据建模问题,但这是一个更大的问题。你真的应该有一个2018年和2020年价值的价格表。Access SQL中没有
CASE
CONVERT
方法。此外,与任何SQL表达式一样,所有表都需要在查询中才能使用其列。请使用
FROM
JOIN
子句(而不是行代码片段)显示完整查询。ADP是一个优秀的RAD(快速应用程序开发)工具,可惜它们被弃用了。您是否能够在SQL数据库中创建一个视图,以满足您的需要。然后你可以在你的ADP中引用它。听起来你确实有一些数据建模问题,但这是一个更大的问题。你真的应该有一个2018年和2020年价值的价格表。Access SQL中没有
CASE
CONVERT
方法。此外,与任何SQL表达式一样,所有表都需要在查询中才能使用其列。请使用
FROM
JOIN
子句(不是行片段)显示完整查询。我认为这对于ADP-Access数据项目不正确。使用喷气发动机实际上没有存储任何数据。没有这样的链接表-它完全引用SQL Server数据库啊,是的,我错误地将
accde
文件、编译后的可执行版本的
accdb
混为一谈。然后,OP将需要使用TSQL方言,而截至SQL Server 2012,TSQL方言并不支持。我认为这对于ADP-Access数据项目是不正确的。使用喷气发动机实际上没有存储任何数据。没有这样的链接表-它完全引用SQL Server数据库啊,是的,我错误地将
accde
文件、编译后的可执行版本的
accdb
混为一谈。然后,OP将需要使用TSQL方言,而截至SQL Server 2012,TSQL方言并不支持。据此编辑。
SELECT      TOP 100 PERCENT dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Service_ID,                         dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Service_Date_From, dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Update_Status,                         dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Account_Number, dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Service_Units,                         dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Modifiers, dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Procedure_Code,                         NormalUnionCPASumAdjustments.SumAmount AS Adjustment, NormalUnionCPASumPayments.SumAmount AS Payment,                         dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Service_Fee AS Charge,                         dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Service_Fee - ISNULL(NormalUnionCPASumPayments.SumAmount, 0) AS Unpaid,                         dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Primary_Diagnosis_Code, LastInsurancePmt.last_insurance_pmt,                         dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Patient_Number, dbo.VWCFees_2018_2020.VWC_2020, dbo.VWCFees_2018_2020.VWC_2018,                        IIF (dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Service_Date_From < CDate('2020-01-01 00:00:00'),dbo.VWCFees_2018_2020.VWC_2018,dbo.VWCFees_2018_2020.VWC_2020) AS VWCFEE
FROM          dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo LEFT OUTER JOIN                        dbo.VWCFees_2018_2020 ON dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Procedure_Code = dbo.VWCFees_2018_2020.CPT LEFT OUTER JOIN                        dbo.NormalUnionCPASumAdjustments() NormalUnionCPASumAdjustments ON                         dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Service_ID = NormalUnionCPASumAdjustments.Service_ID LEFT OUTER JOIN                        dbo.NormalUnionCPASumPayments() NormalUnionCPASumPayments ON                         dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Service_ID = NormalUnionCPASumPayments.Service_ID LEFT OUTER JOIN                        dbo.LastInsurancePmt() LastInsurancePmt ON dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Service_ID = LastInsurancePmt.Service_ID
WHERE      (dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Update_Status <= 1) AND                         (dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Service_Date_From BETWEEN @StartDate AND @EndDate) AND                         (dbo.VHCSERVER_Ntier_VHC_dbo_vwGenSvcInfo.Patient_Number = @VHC_NumberChild)
SELECT
  ...
  IIF(t.[Purchase_Date] < '2020-01-01', p18.price, p20.price)
  ...
FROM [Transactions] t
INNER JOIN [Price_2018] p18
  ON t.price_id = p18.price_id
INNER JOIN [Price_2020] p20
  ON t.price_id = p20.price_id