我在Microsoft访问中创建了此查询,我正在尝试在SQL Server 2012中运行它,但是我遇到了一些错误,我尝试了几种不同的方法来修复它但我仍然无法使其正常工作
SELECT Choose(Iif(IsNull([TaxCodeChangeTypeID]),0,
[TaxCodeChangeTypeID])+1,
'UNKNOWN',
'UPLIFT',
'PAPERP6',
'PAPERP9',
'P453',
'P46',
'HMRC',
'DPSP6',
'DPSP9',
'P46(Pen)',
'P46(Expat)') AS [Tax Code Change Type]
FROM EeBals
答案 0 :(得分:3)
正如评论中所提到的,Access中的ISNULL
接受一个参数并返回一个布尔值,具体取决于传递的参数是否为空,在SQL Server ISNULL中有两个参数,第一个是要检查的值,以及第二个是如果值为null则返回的值,所以你的行:
Iif(IsNull([TaxCodeChangeTypeID]),0, [TaxCodeChangeTypeID])+1
需要替换为
ISNULL([TaxCodeChangeTypeID], 0) + 1
实现同样的目标。完整查询:
SELECT CHOOSE(ISNULL([TaxCodeChangeTypeID], 0) + 1,
'UNKNOWN',
'UPLIFT',
'PAPERP6',
'PAPERP9',
'P453',
'P46',
'HMRC',
'DPSP6',
'DPSP9',
'P46(Pen)',
'P46(Expat)') AS [Tax Code Change Type]
FROM EeBals
答案 1 :(得分:2)
无法测试,但似乎ISNULL
应该是唯一的问题。
在MS Access
中,ISNULL
如果选中的值实际上为空,则返回true,但在SQL Server
中,它的作用类似于COALESCE
(但只取2而不是无限制参数)如果第一个值为null,则返回第二个值。
CHOOSE
和Iif
应该与SQL Server中的MS Access类似。
我只需将IsNull([TaxCodeChangeTypeID])
替换为[TaxCodeChangeTypeID] IS NULL
SELECT Choose
(
Iif
(
[TaxCodeChangeTypeID] IS NULL,
0,
[TaxCodeChangeTypeID]
)+1,
'UNKNOWN','UPLIFT','PAPERP6','PAPERP9','P453','P46','HMRC','DPSP6','DPSP9','P46(Pen)','P46(Expat)'
) AS [Tax Code Change Type]
FROM EeBals
注意:这仅适用于版本SQL Server
后的2012
,之前标准IIF
或{{CHOOSE
中都不存在SQL Server
和SQL Server Express
1}}
PS:当然,现在可以通过编写IIf(...)+1
来避免整个ISNULL([TaxCodeChangeTypeID], 0) + 1
并更加美化as GarethD also mentioned in his post。