Я работаю над проектом MS Access для миграции на SQL Server и в настоящее время преобразую сложный запрос в T-SQL из MS Access. Теперь я хорошо знаком с тем, как Nz работает в Access и как 0 или пустая строка "" возвращается, если valueifnull аргумент не предоставлен. Источник: https://support.office.com/en-gb/article/nz-function-8ef85549-cc9c-438b-860a-7fd9f4c69b6c
Исключением из этого правила является то, что в выражении запроса используется функция Nz, и в этом случае возвращается значение в случае нулевого значения в Вариант , - пустая строка.
Теперь, переходя к моей реальной проблеме, я работаю над преобразованием этого Nz-заполненного выражения запроса в T-SQL, используя ISNULL в T-SQL. ISNULL требует 2 аргументов. И выражение , и значение . Последнее, являющееся необязательным аргументом в Access 'Nz, затруднило мне перевод выражения. Аргумент Value также должен соответствовать исходному типу данных Variant (в SQL Server), это означает, что я не могу просто добавить пустую строку "" в качестве второго аргументакак Nz в Access делает по умолчанию.
Возьмите фрагмент сложного запроса, который я использую в Access, по сравнению с тем, что я написал в T-SQL:
Access
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
Обратите внимание на выше NULL inпример T-SQL. Этот NULL не подходит, так как он портит мои вычисления, по сути, мне нужно имитировать Nz без второго аргумента в T-SQL.
Редактировать: не помещая весь запрос в этот вопрос, Вот ожидаемый результат для задания №: 294784 в MS Access и SQL Server:
Результаты доступа: ![enter image description here](https://i.stack.imgur.com/ibYcJ.png)
Результаты SQL: ![enter image description here](https://i.stack.imgur.com/p0SFW.png)
Редактировать 2: добавили отредактированный код для добавления всего кода.