T10=] 中的 NZ 函数,其中未指定 Value If Null

NZ function in T-SQL where ValueIfNull is NOT specified

我正在从事 MS Access 到 SQL 服务器迁移项目,目前正在将复杂查询从 MS Access 转换为 T-SQL。 现在我非常熟悉 Nz 在 Access 中的工作方式以及 0 或空字符串 " " 如果未提供 valueifnull 参数,则返回。 资料来源:https://support.office.com/en-gb/article/nz-function-8ef85549-cc9c-438b-860a-7fd9f4c69b6c

此规则的例外情况是,如果在查询表达式中使用 Nz 函数,在这种情况下,Variant 中为 null 时的返回值为空字符串。

现在,转到我的实际问题,我正在使用 T-[=74 中的 ISNULL 将这个 Nz 填充的查询表达式转换为 T-SQL =]. ISNULL 需要 2 个参数。 表达式。后者是 Access 的 Nz 中的一个可选参数,这让我翻译这个表达式有点困难。 Value 参数还需要匹配 Variant 的原始数据类型(在 SQL 服务器中),这意味着我不能简单地添加一个空字符串 " " 作为 Access 中 Nz 默认的第二个参数。

将我在 Access 中使用的复杂查询与我在 T-SQL:

中编写的内容进行比较

访问

TotalWIP: IIf([PercentageDoneTotal]<0,0,IIf(nz([TotalPurchasesReceived])+ 
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0))+IIf((([Accepted 
Price]*[OutstandingBalance]*0.9)-nz([TotalPurchasesReceived])- 
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0)))>0,((([Accepted 
Price]*[OutstandingBalance]*0.9)-nz([TotalPurchasesReceived])- 
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0)))* 
[PercentageDoneTotal]),0)>([Accepted Price]*[OutstandingBalance]*0.9), 
([Accepted Price]*[OutstandingBalance]*0.9),nz([TotalPurchasesReceived])+ 
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0))+IIf((([Accepted 
Price]*[OutstandingBalance]*0.9)-nz([TotalPurchasesReceived])- 
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0)))>0,((([Accepted 
Price]*[OutstandingBalance]*0.9)-nz([TotalPurchasesReceived])- 
(IIf([PercentageDoneTotal]>0,nz([TotalStockAllocated]),0)))* 
[PercentageDoneTotal]),0)))

T-SQL

IIf([PercentageDoneTotal]<0,0,
IIf(ISNULL([TotalPurchasesReceived],NULL)+ 
(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0))+
IIf((([Accepted Price]*[OutstandingBalance]*0.9)- 
ISNULL([TotalPurchasesReceived],NULL)
-(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0)))>0, 
((([Accepted Price]*[OutstandingBalance]*0.9)- 
ISNULL([TotalPurchasesReceived],NULL)- 
(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0)))* 
[PercentageDoneTotal]),0)>([Accepted Price]*[OutstandingBalance]*0.9), 
([Accepted Price]* 
[OutstandingBalance]*0.9),ISNULL([TotalPurchasesReceived],NULL)+ 
(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0))+
 IIf((([Accepted Price]*[OutstandingBalance]*0.9)- 
 ISNULL([TotalPurchasesReceived],NULL)- 
(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0)))>0, 
((([Accepted Price]*[OutstandingBalance]*0.9)- 
ISNULL([TotalPurchasesReceived],NULL)- 
(IIf([PercentageDoneTotal]>0,ISNULL([TotalStockAllocated],NULL),0)))* 
[PercentageDoneTotal]),0))
 ) AS TotalWIP

注意上面T-SQL例子中的NULL。这个 NULL 不合适,因为它打乱了我的计算,我基本上需要在 T-SQL.

中没有第二个参数的情况下模仿 Nz

编辑: 在不将整个查询放入这个问题的情况下,这是作业编号的预期结果:MS Access 和 SQL 服务器中的 294784:

访问结果:

SQL 结果:

编辑 2:已添加编辑以添加完整代码。

正如@Salman A 指出的那样,这是不使用 variant 的重要理由。但话虽如此,我假设你正在寻找一个数值,所以为什么不使用:

    IIF([PercentageDoneTotal]<0,0, IIF(ISNULL([TotalPurchasesReceived],0)+ 
      (IIF([PercentageDoneTotal]>0,ISNULL([TotalStockAllocate],0),0))