SQL查询在')'附近给出了不正确的语法-在INNER JOIN中使用CAST

问题描述 投票:0回答:2

我从以下SQL查询中得到')'附近的错误语法错误:

SELECT 
"GLPOST"."ACCTID",
"GLPOST"."FISCALYR",
"GLPOST"."FISCALPERD",
"GLPOST"."SRCELEDGER",
"GLPOST"."JRNLDATE",
"GLPOST"."BATCHNBR",
"GLPOST"."ENTRYNBR",
"GLPOST"."JNLDTLDESC",
"GLPOST"."JNLDTLREF",
"GLPOST"."TRANSAMT",
"APIBC"."POSTSEQNBR",
"APIBC"."CNTBTCH"

FROM ("MHLDAT"."dbo"."GLPOST" "GLPOST" 
INNER JOIN "MHLDAT"."dbo"."GLJEH" "GLJEH"
ON (("GLPOST"."DRILSRCTY"="GLJEH"."DRILSRCTY") 
AND ("GLPOST"."DRILLDWNLK"="GLJEH"."DRILLDWNLK") 
AND "GLPOST"."DRILAPP"="GLJEH"."DRILAPP"))) 
INNER JOIN "MHLDAT"."dbo"."APIBC" "APIBC" 
ON "APIBC"."POSTSEQNBR" = (CAST ("SUBSTRING" (CAST ("GLPOST"."DRILLDWNLK" AS "CHAR"(18)),3,CAST ("LEFT" (CAST ("GLPOST"."DRILLDWNLK" AS "CHAR"(18)),1) AS "INT" )) AS "INT" )) 

WHERE  
    "GLPOST"."SRCELEDGER"=N'AP' AND "GLPOST"."FISCALYR"=N'2021' AND "GLPOST"."FISCALPERD"=N'01' AND "GLJEH"."ERRBATCH"=0

有任何解决的建议吗?

sql-server casting syntax-error inner-join
2个回答
0
投票

您可能会丢失所有双引号:

SELECT 
GLPOST.ACCTID,
GLPOST.FISCALYR,
GLPOST.FISCALPERD,
GLPOST.SRCELEDGER,
GLPOST.JRNLDATE,
GLPOST.BATCHNBR,
GLPOST.ENTRYNBR,
GLPOST.JNLDTLDESC,
GLPOST.JNLDTLREF,
GLPOST.TRANSAMT,
APIBC.POSTSEQNBR,
APIBC.CNTBTCH
FROM MHLDAT.dbo.GLPOST GLPOST 
INNER JOIN MHLDAT.dbo.GLJEH GLJEH
ON ((GLPOST.DRILSRCTY=GLJEH.DRILSRCTY) 
AND (GLPOST.DRILLDWNLK=GLJEH.DRILLDWNLK) 
AND GLPOST.DRILAPP=GLJEH.DRILAPP)) 
INNER JOIN MHLDAT.dbo.APIBC APIBC 
INNER JOIN MHLDAT.dbo.APIBC APIBC 
ON APIBC.POSTSEQNBR = 
    CAST 
        (SUBSTRING(CAST(GLPOST.DRILLDWNLK AS CHAR(18)),3,CAST(LEFT(CAST(GLPOST.DRILLDWNLK AS CHAR(18)),1) AS INT )) 
    AS INT )
WHERE  
    GLPOST.SRCELEDGER = 'AP' AND GLPOST.FISCALYR= '2021' AND GLPOST.FISCALPERD= '01' AND GLJEH.ERRBATCH = 0

0
投票
SELECT 
    GLPOST.ACCTID,
    GLPOST.FISCALYR,
    GLPOST.FISCALPERD,
    GLPOST.SRCELEDGER,
    GLPOST.JRNLDATE,
    GLPOST.BATCHNBR,
    GLPOST.ENTRYNBR,
    GLPOST.JNLDTLDESC,
    GLPOST.JNLDTLREF,
    GLPOST.TRANSAMT,
    APIBC.POSTSEQNBR,
    APIBC.CNTBTCH    
FROM MHLDAT.dbo.GLPOST  
    INNER JOIN MHLDAT.dbo.GLJEH 
        ON     GLPOST.DRILSRCTY=GLJEH.DRILSRCTY
           AND GLPOST.DRILLDWNLK=GLJEH.DRILLDWNLK
           AND GLPOST.DRILAPP=GLJEH.DRILAPP
    INNER JOIN MHLDAT.dbo.APIBC 
         ON    APIBC.POSTSEQNBR = CAST(SUBSTRING(CAST(GLPOST.DRILLDWNLK 
                                                      AS CHAR(18)),
                                                 3,
                                                 CAST(LEFT(CAST(GLPOST.DRILLDWNLK 
                                                                AS CHAR(18)),
                                                           1) 
                                                       AS INT)
                                       ) 
                                       AS INT)        
WHERE  
        GLPOST.SRCELEDGER = N'AP' 
    AND GLPOST.FISCALYR = N'2021' 
    AND GLPOST.FISCALPERD = N'01' 
    AND GLJEH.ERRBATCH = 0

您使用了很多不必要的括号并用双引号将其删除(特别是在函数SUBSTRING和LEFT的名称上)。删除别名(因为使用与表相同的名称,所以它们是不必要的)。

我已经将您的查询对齐,因此您可以直观地看到每个子表达式的开始和结束位置。

© www.soinside.com 2019 - 2024. All rights reserved.