代码之家  ›  专栏  ›  技术社区  ›  Boltie

开关参数数量不正确-看不到位置

  •  0
  • Boltie  · 技术社区  · 7 年前

    我试图在MS Access中使用SWITCH函数,但我一直被告知参数的数量不正确。我不熟悉switch函数,但我理解语法。

    开关(expression1,value1,expression2,value2,…expression\u n,value\u n)

    我是否在交换机中做了一些无法使用的事情,子查询可能?我已经检查了逗号、括号,以及是否有一个表达式和一个返回值。当我从T-SQL转换到jet并替换一个运行良好的CASE语句时,这让我抓狂。

    Switch(
            (eh.STARTDTE <> sh.STARTDTE AND IsNull(eh.ENDDTE,"") <> IsNull(sh.ENDDTE,"") AND eh.STARTDTE < sh.STARTDTE),
              "FAIL - Employment Start Date Before Service Start Date",
            (eh.STARTDTE <> sh.STARTDTE AND IsNull(eh.ENDDTE,"") <> IsNull(sh.ENDDTE,"") AND eh.ENDDTE > sh.ENDDTE),
              "FAIL - Employment End Date After Service End Date",
            (eh.STARTDTE <> sh.STARTDTE AND IsNull(eh.ENDDTE,"") <> IsNull(sh.ENDDTE,"") AND  (
                                                                                                SELECT
                                                                                                    COUNT(*)
                                                                                                FROM
                                                                                                    emphist AS eh2
                                                                                                WHERE
                                                                                                    eh2.MEMBNO = sh.MEMBNO
                                                                                                AND eh2.EMPID = sh.EMPID
                                                                                                AND eh2.ENDDTE = DateAdd(dd,-1,eh.STARTDTE)
                                                                                              ) = 0),
              "FAIL - Previous Employment Period Corrupt or Missing",
            (eh.STARTDTE <> sh.STARTDTE AND IsNull(eh.ENDDTE,"") <> IsNull(sh.ENDDTE,"") AND  (
                                                                                                SELECT
                                                                                                    COUNT(*)
                                                                                                FROM
                                                                                                    emphist AS eh2
                                                                                                WHERE
                                                                                                    eh2.MEMBNO = sh.MEMBNo
                                                                                                AND eh2.EMPID = sh.EMPID
                                                                                                AND eh2.ENDDTE = DateAdd(dd,-1,eh.STARTDTE)
                                                                                              ) = 0),
              "FAIL - Previous Employment Period Corrupt or Missing",
            (eh.STARTDTE <> sh.STARTDTE AND IsNull(eh.ENDDTE,"") <> IsNull(sh.ENDDTE,"") AND (
                                                                                                SELECT
                                                                                                    COUNT(*)
                                                                                                FROM
                                                                                                    emphist AS eh2
                                                                                                WHERE
                                                                                                    eh2.MEMBNO = sh.MEMBNO
                                                                                                AND eh2.EMPID = sh.EMPID
                                                                                                AND eh2.STARTDTE = DateAdd(dd,1,eh.ENDDTE)
                                                                                              ) = 0),
              "FAIL - Next Employment Period Corrupt or Missing",
            (eh.STARTDTE = sh.STARTDTE AND eh.ENDDTE <> sh.ENDDTE AND (
                                                                        SELECT
                                                                            COUNT(*)
                                                                        FROM
                                                                            emphist AS eh2
                                                                        WHERE
                                                                            eh2.MEMBNO = sh.MEMBNO
                                                                        AND eh2.EMPID = sh.EMPID
                                                                        AND eh2.STARTDTE = DateAdd(dd,1,eh.ENDDTE)
                                                                      ) = 0),
              "FAIL - Next Employment Period Corrupt or Missing",
            (eh.STARTDTE <> sh.STARTDTE AND eh.ENDDTE = sh.ENDDTE AND (
                                                                        SELECT
                                                                            COUNT(*)
                                                                        FROM
                                                                            emphist AS eh2
                                                                        WHERE
                                                                            eh2.MEMBNO = sh.MEMBNO
                                                                        AND eh2.EMPID = sh.EMPID
                                                                        AND eh2.ENDDTE = DateAdd(dd,-1,eh.STARTDTE)
                                                                      ) = 0),
              "FAIL - Previous Employment Period Corrupt or Missing",
            (eh.STARTDTE = sh.STARTDTE AND eh.ENDDTE = sh.ENDDTE AND  (
                                                                        SELECT
                                                                            COUNT(*)
                                                                        FROM
                                                                            emphist AS eh2
                                                                        WHERE
                                                                            eh2.MEMBNO = sh.MEMBNO
                                                                        AND eh2.EMPID = sh.EMPID
                                                                      ) <> 1),
              "FAIL - Too Many or No Employment History Records"
      ) AS "Reason"
    

    更新了答案

    Switch(
            (eh.STARTDTE <> sh.STARTDTE AND NZ(eh.ENDDTE,"") <> NZ(sh.ENDDTE,"") AND eh.STARTDTE < sh.STARTDTE),
              "FAIL - Employment Start Date Before Service Start Date",
            (eh.STARTDTE <> sh.STARTDTE AND NZ(eh.ENDDTE,"") <> NZ(sh.ENDDTE,"") AND eh.ENDDTE > sh.ENDDTE),
              "FAIL - Employment End Date After Service End Date",
            (eh.STARTDTE <> sh.STARTDTE AND NZ(eh.ENDDTE,"") <> NZ(sh.ENDDTE,"") AND  (
                                                                                                SELECT
                                                                                                    COUNT(*)
                                                                                                FROM
                                                                                                    emphist AS eh2
                                                                                                WHERE
                                                                                                    eh2.MEMBNO = sh.MEMBNO
                                                                                                AND eh2.EMPID = sh.EMPID
                                                                                                AND eh2.ENDDTE = DateAdd("dd",-1,eh.STARTDTE)
                                                                                              ) = 0),
              "FAIL - Previous Employment Period Corrupt or Missing",
            (eh.STARTDTE <> sh.STARTDTE AND NZ(eh.ENDDTE,"") <> NZ(sh.ENDDTE,"") AND  (
                                                                                                SELECT
                                                                                                    COUNT(*)
                                                                                                FROM
                                                                                                    emphist AS eh2
                                                                                                WHERE
                                                                                                    eh2.MEMBNO = sh.MEMBNo
                                                                                                AND eh2.EMPID = sh.EMPID
                                                                                                AND eh2.ENDDTE = DateAdd("dd",-1,eh.STARTDTE)
                                                                                              ) = 0),
              "FAIL - Previous Employment Period Corrupt or Missing",
            (eh.STARTDTE <> sh.STARTDTE AND NZ(eh.ENDDTE,"") <> NZ(sh.ENDDTE,"") AND (
                                                                                                SELECT
                                                                                                    COUNT(*)
                                                                                                FROM
                                                                                                    emphist AS eh2
                                                                                                WHERE
                                                                                                    eh2.MEMBNO = sh.MEMBNO
                                                                                                AND eh2.EMPID = sh.EMPID
                                                                                                AND eh2.STARTDTE = DateAdd("dd",1,eh.ENDDTE)
                                                                                              ) = 0),
              "FAIL - Next Employment Period Corrupt or Missing",
            (eh.STARTDTE = sh.STARTDTE AND eh.ENDDTE <> sh.ENDDTE AND (
                                                                        SELECT
                                                                            COUNT(*)
                                                                        FROM
                                                                            emphist AS eh2
                                                                        WHERE
                                                                            eh2.MEMBNO = sh.MEMBNO
                                                                        AND eh2.EMPID = sh.EMPID
                                                                        AND eh2.STARTDTE = DateAdd("dd",1,eh.ENDDTE)
                                                                      ) = 0),
              "FAIL - Next Employment Period Corrupt or Missing",
            (eh.STARTDTE <> sh.STARTDTE AND eh.ENDDTE = sh.ENDDTE AND (
                                                                        SELECT
                                                                            COUNT(*)
                                                                        FROM
                                                                            emphist AS eh2
                                                                        WHERE
                                                                            eh2.MEMBNO = sh.MEMBNO
                                                                        AND eh2.EMPID = sh.EMPID
                                                                        AND eh2.ENDDTE = DateAdd("dd",-1,eh.STARTDTE)
                                                                      ) = 0),
              "FAIL - Previous Employment Period Corrupt or Missing",
            (eh.STARTDTE = sh.STARTDTE AND eh.ENDDTE = sh.ENDDTE AND  (
                                                                        SELECT
                                                                            COUNT(*)
                                                                        FROM
                                                                            emphist AS eh2
                                                                        WHERE
                                                                            eh2.MEMBNO = sh.MEMBNO
                                                                        AND eh2.EMPID = sh.EMPID
                                                                      ) <> 1),
              "FAIL - Too Many or No Employment History Records"
      ) AS "Reason"
    
    2 回复  |  直到 7 年前
        1
  •  0
  •   Gustav    7 年前

    事实并非如此 转换 但是 IsNull 这就产生了错误。因此,请替换所有这些错误的语句:

    IsNull(eh.ENDDTE,"")
    

    使用:

    Nz(eh.ENDDTE)
    
        2
  •  0
  •   Boltie    7 年前

    好的,有两个问题。

    1. IsNull函数不是访问函数,所以我用NZ(相同语法)替换了它。

    2. 对于DateAdd函数,我忽略了用语音标记包围datepart参数。

    查询现在顺利运行。我猜想,由于IsNull函数没有被识别出来,它似乎缺少了参数,我想是的。经验教训是,参数数量不正确也可能表示函数无效。