将查询从访问SQL更改为SQL Server

时间:2014-08-22 10:16:57

标签: sql sql-server

我在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

2 个答案:

答案 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,则返回第二个值。

CHOOSEIif应该与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 ServerSQL Server Express 1}}

PS:当然,现在可以通过编写IIf(...)+1来避免整个ISNULL([TaxCodeChangeTypeID], 0) + 1并更加美化as GarethD also mentioned in his post