Sql server 使用按位AND将DB2 SQL查询转换为SQL Server查询
我工作的公司使用一个名为Showcase的程序在我们的财务部门构建报告,Showcase根据插入到界面中的条件构建SQL查询,并返回数据,然后在Excel中用于进一步格式化和分析。我们有一个特定的报告不断中断,所以我尝试在SQL Server中重写查询 FROM子句中有一部分执行按位AND运算。我以前从未在SQL查询中使用过这一点,这就是查询的问题所在。我甚至不知道它试图通过按位AND实现什么-它只是比较两个值的更精确的方法吗 以下是FROM条款,因为它直接来自Showcase:Sql server 使用按位AND将DB2 SQL查询转换为SQL Server查询,sql-server,sql-server-2008,db2,Sql Server,Sql Server 2008,Db2,我工作的公司使用一个名为Showcase的程序在我们的财务部门构建报告,Showcase根据插入到界面中的条件构建SQL查询,并返回数据,然后在Excel中用于进一步格式化和分析。我们有一个特定的报告不断中断,所以我尝试在SQL Server中重写查询 FROM子句中有一部分执行按位AND运算。我以前从未在SQL查询中使用过这一点,这就是查询的问题所在。我甚至不知道它试图通过按位AND实现什么-它只是比较两个值的更精确的方法吗 以下是FROM条款,因为它直接来自Showcase: FROM S
FROM
S06947A4.GLDBFA.GLPCT T01
INNER JOIN S06947A4.GLDBFA.GLPDA GLPDA ON T01.CTCO=GLPDA.DACO
LEFT OUTER JOIN S06947A4.GLDBFA.GLPBX T02 ON T01.CTCO=T02.BXCO AND T01.CTPAGE=T02.BXPAGE AND GLPDA.DAYEAR=T02.BXYEAR AND &GLMORS=T02.BXMORS
LEFT OUTER JOIN S06947A4.GLDBFA.GLPGL T03 ON T01.CTCO=T03.GLCO AND T01.CTPAGE=T03.GLPAGE AND GLPDA.DAYEAR=T03.GLYEAR AND &GLMORS=T03.GLMORS
问题似乎在于两个左侧外部联接的最后一部分:
&GLMORS=T02.BXMORS
&GLMORS=T03.GLMORS
到目前为止,我在重建查询时没有遇到任何问题,如果我从每个连接中省略这两个部分,我会得到一些返回的数据,但是我可以看出这是错误的,因为我得到的行比我预期的多
如有任何提示或注释,将不胜感激。
非常感谢
我已对FROM子句进行了编辑,以使参数更具体:
FROM
GLDBFA.GLPCT PCT
INNER JOIN GLDBFA.GLPDA PDA ON PCT.CTCO=PDA.DACO
LEFT OUTER JOIN GLDBFA.GLPBX PBX ON CTCO=PBX.BXCO AND CTPAGE=PBX.BXPAGE AND PDA.DAYEAR=PBX.BXYEAR AND PGL.GLMORS=PBX.BXMORS
LEFT OUTER JOIN GLDBFA.GLPGL PGL ON CTCO=PGL.GLCO AND CTPAGE=PGL.GLPAGE AND PDA.DAYEAR=PGL.GLYEAR AND PGL.GLMORS=PBX.BXMORS
带下划线的错误位于第一个左外部联接中:
AND PGL.GLMORS=PBX.BXMORS
它不喜欢语句中的'PGL.GLMORS'部分,但是在第二个左外连接中它可以使用,这对我来说是没有意义的。
希望这能有所帮助
我发现了自己的错误。 “&GLMORS”值实际上是传递给Showcase的变量,因此我必须对这些变量值进行编码以满足FROM的要求
再次感谢大家的投入和帮助。表格结构和/或错误消息将大有帮助 乍一看,
&GLMORS=T03.GLMORS
让我觉得您的GLMORS
列有冲突,您需要类似于&T01.GLMORS=T03.GLMORS
的内容
否则,按位(&)运算符是二进制运算符,它接受2个值并输出一个结果。所以你得到了liek
5&12=4
。在本例中,您有一个“一元”&
,我不知道它应该做什么,但它看起来不像是按位和。在引入相关名称之前,您正在引用相关名称PGL
,请参见代码片段中的注释:
INNER JOIN GLDBFA.GLPDA PDA ON PCT.CTCO=PDA.DACO
LEFT OUTER JOIN GLDBFA.GLPBX PBX
ON CTCO=PBX.BXCO
AND CTPAGE=PBX.BXPAGE
AND PDA.DAYEAR=PBX.BXYEAR
AND PGL.GLMORS=PBX.BXMORS -- <<< "PGL" is unknown at this point
-- it is only introduced on the next line
-- and this condition is redundant anyway
-- so it can be safely removed
LEFT OUTER JOIN GLDBFA.GLPGL PGL
ON CTCO=PGL.GLCO
AND CTPAGE=PGL.GLPAGE
AND PDA.DAYEAR=PGL.GLYEAR
AND PGL.GLMORS=PBX.BXMORS
在PCT.CTCO=PDA.DACO上内部连接GLDBFA.GLPDA
左外连接GLDBFA.GLPBX PBX
在CTCO=PBX.BXCO上
和CTPAGE=PBX.BXPAGE
和PDA.DAYEAR=PBX.BXYEAR
PGL.GLMORS=PBX.BXMORS——这就是发送到SQL Server数据库的SQL,是吗?或者Showcase本身就是一个数据库?所以Showcase是一个连接到我们的金融系统的程序,但是人们为它构建的查询似乎经常中断。我已经开始构建一个用于报告的数据仓库,最近我已经建立了一个到我们的金融系统的ODBC连接,以将数据拉过来,这样我就可以在SQL Server中重新编写这些查询。因为这些查询是系统生成的,所以它们似乎使用了一些我不熟悉的方法,比如按位查询和FROM子句中的查询。这更有意义吗?好吧,那么金融系统不是sqlsvr。不,数据位于AS400上,我相信它是一个DB2数据库。建议您添加DB2标记并更改标题,询问如何将具有按位操作的DB2查询转换为T-SQL;抱歉,这不是我的专业领域,谢谢你花时间看这个。我得到的错误是:Msg 4104,级别16,状态1,第129行多部分标识符“PGL.GLMORS”无法绑定。但这对我来说没有意义,因为我已经为编辑更新了子句(见上文)。