Sql server 使用按位AND将DB2 SQL查询转换为SQL Server查询

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

我工作的公司使用一个名为Showcase的程序在我们的财务部门构建报告,Showcase根据插入到界面中的条件构建SQL查询,并返回数据,然后在Excel中用于进一步格式化和分析。我们有一个特定的报告不断中断,所以我尝试在SQL Server中重写查询

FROM子句中有一部分执行按位AND运算。我以前从未在SQL查询中使用过这一点,这就是查询的问题所在。我甚至不知道它试图通过按位AND实现什么-它只是比较两个值的更精确的方法吗

以下是FROM条款,因为它直接来自Showcase:

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”无法绑定。但这对我来说没有意义,因为我已经为编辑更新了子句(见上文)。