从 Oracle 转换为 SQL Server

Posted

技术标签:

【中文标题】从 Oracle 转换为 SQL Server【英文标题】:Conversion from Oracle into SQL Server 【发布时间】:2016-01-22 23:31:58 【问题描述】:

我正在尝试将 Oracle 脚本解释为 SQL 脚本,但我发现我将连接转换错误,因为 Oracle 正在使用同一个表的多个实例(请参阅 select 语句中的 orguserfield_c、orguserfield_e 等)。任何人都可以帮助我将 Oracle 转换为 SQL 脚本。谢谢 甲骨文脚本:

 select distinct
   wh_acctcommon.effdate
 , wh_acctcommon.acctnbr
 , wh_acctcommon.acctclosecurrmonthyn
 , wh_acctcommon.acctofficer
 , wh_acctcommon.acctofficernbr
 , wh_acctcommon.acctopencurrmonthyn
 , wh_acctcommon.notebal
 , wh_acctcommon.branchname
 , wh_acctcommon.branchorgnbr
 , orguserfield_c.value                 branch_internal_no
 , orguserfield_e.value                 branch_status
 , orguserfield_h.value                 branch_hub_no
 , orguserfield_i.value                 metro_micro
 , orguserfield_j.value                 division
 , userfieldvalue_l.userfieldvaluedesc  division_name
 , orguserfield.value                   region
 , userfieldvalue.userfieldvaluedesc    region_name
 , wh_acctcommon.primaryownercity
 , wh_acctcommon.closedate
 , wh_acctcommon.compoundcalpercd
 , wh_acctcommon.contractdate
 , wh_acctcommon.datelastmaint
 , wh_acctcommon.ownername
 , wh_acctcommon.bankorgnbr
 , wh_acctcommon.intbase
 , wh_acctcommon.intmethcd
 , wh_acctcommon.noteintrate
 , wh_acctcommon.ownersortname
 , wh_acctcommon.loanofficer
 , wh_acctcommon.loanofficersnbr
 , wh_acctcommon.mjaccttypcd
 , wh_acctcommon.managingofficer
 , wh_acctcommon.managingofficernbr
 , acctacctrolepers.persnbr             SBB_Portfolio_Mgr_Nbr
 , persview.fullname                    SBB_Portfolio_Mgr
 , acctacctrolepers_c.persnbr           Orig_Loan_Officer_Nbr
 , persview_d.fullname                  Orig_Loan_Officer
 , acctacctrolepers_e.persnbr           Collection_Officer_Nbr
 , persview_e.fullname                  Collection_Officer
 , wh_acctcommon.datemat
 , wh_acctcommon.intminbalamt
 , wh_acctcommon.intmincalcbaltypcd
 , wh_acctcommon.monthendyn
 , wh_acctcommon.notemtdavgbal
 , wh_acctcommon.nameaddr1
 , wh_acctcommon.nameaddr2
 , wh_acctcommon.nameaddr3
 , wh_acctcommon.nameaddr4
 , wh_acctcommon.nameaddr5
 , wh_acctcommon.notenextratechangedate
 , wh_acctcommon.noteopenamt
 , wh_acctcommon.originatingperson
 , wh_acctcommon.origpersnbr
 , wh_acctcommon.bookbalance
 , wh_acctcommon.businessphone
 , wh_acctcommon.homephone
 , wh_acctcommon.currmiaccttypcd
 , wh_acctcommon.product
 , wh_acctcommon.calcbaltypcd
 , wh_acctcommon.noteratechangecalpercd
 , wh_acctcommon.daysmethcd
 , wh_acctcommon.noteintcalcschednbr
 , wh_acctcommon.ratetypcd
 , wh_acctcommon.primaryownerstate
 , wh_acctcommon.curracctstatcd
 , wh_acctcommon.curracctstateffdate
 , wh_acctcommon.taxidnbr
 , wh_acctcommon.taxrptfororgnbr
 , wh_acctcommon.taxrptforpersnbr
 , wh_acctcommon.currterm
 , wh_acctcommon.primaryownerzipcd
 , wh_acctcommon.primaryownerzipcdsuff
  from OSIBANK.wh_acctcommon
 , OSIBANK.orguserfield
 , OSIBANK.orguserfield     orguserfield_c
 , OSIBANK.orguserfield     orguserfield_e
 , OSIBANK.orguserfield     orguserfield_h
 , OSIBANK.orguserfield     orguserfield_i
 , OSIBANK.orguserfield     orguserfield_j
 , OSIBANK.userfieldvalue
 , OSIBANK.userfieldvalue   userfieldvalue_l
 , OSIBANK.acctacctrolepers
 , OSIBANK.persview
 , OSIBANK.acctacctrolepers acctacctrolepers_c
 , OSIBANK.persview         persview_d
 , OSIBANK.acctacctrolepers acctacctrolepers_e
 , OSIBANK.persview         persview_e
  where (    wh_acctcommon.branchorgnbr         = orguserfield.orgnbr(+)
     and upper(orguserfield.userfieldcd(+)) = 'WREG'
     and orguserfield.userfieldcd           = userfieldvalue.userfieldcd(+)
     and orguserfield.value                 = userfieldvalue.userfieldvalue(+)
    )
and (     wh_acctcommon.branchorgnbr           = orguserfield_c.orgnbr(+)
     and upper(orguserfield_c.userfieldcd(+)) = 'WBRN'
    )
and (    wh_acctcommon.branchorgnbr           = orguserfield_e.orgnbr(+)
     and upper(orguserfield_e.userfieldcd(+)) = 'WBRS'
    )
and (    wh_acctcommon.branchorgnbr           = orguserfield_h.orgnbr(+)
     and upper(orguserfield_h.userfieldcd(+)) = 'WHBN'
    )
and (    wh_acctcommon.branchorgnbr           = orguserfield_i.orgnbr(+)
     and upper(orguserfield_i.userfieldcd(+)) = 'WSIZ'
    )
and (    wh_acctcommon.branchorgnbr           = orguserfield_j.orgnbr(+)
     and upper(orguserfield_j.userfieldcd(+)) = 'WDIV'
     and orguserfield_j.userfieldcd           = userfieldvalue_l.userfieldcd(+)
     and orguserfield_j.value                 = userfieldvalue_l.userfieldvalue(+)
    )
and (    wh_acctcommon.acctnbr                 = acctacctrolepers.acctnbr(+)
     and upper(acctacctrolepers.acctrolecd(+)) = 'PMGR'
     and acctacctrolepers.persnbr              = persview.persnbr(+)
    )
and (    wh_acctcommon.acctnbr                 = acctacctrolepers_c.acctnbr(+)
     and acctacctrolepers_c.acctrolecd(+)      = 'OLOF'
     and acctacctrolepers_c.persnbr            = persview_d.persnbr(+)
    )
and (    wh_acctcommon.acctnbr                 = acctacctrolepers_e.acctnbr(+)
     and acctacctrolepers_e.acctrolecd(+)      = 'COFF'
     and acctacctrolepers_e.persnbr            = persview_e.persnbr(+)
    );

SQL 脚本:

  select 
  wh_acctcommon.[EFFDATE]
 , wh_acctcommon.acctnbr
 , wh_acctcommon.acctclosecurrmonthyn
 , wh_acctcommon.acctofficer
 , wh_acctcommon.acctofficernbr
 , wh_acctcommon.acctopencurrmonthyn
 , wh_acctcommon.notebal
 , wh_acctcommon.branchname
 , wh_acctcommon.branchorgnbr
 ,OUF.value    AS             'branch_internal_no'
 , OUF.value AS                 'branch_status'
 , OUF.value   AS             'branch_hub_no'
 , OUF.value     AS            'metro_micro'
 , OUF.value       AS          'division'
 , UFV.[USERFIELDVALUEDESC] AS 'division_name'
 , OUF.value               AS    'region'
 , UFV.userfieldvaluedesc  AS  'region_name'
 , wh_acctcommon.primaryownercity
 , wh_acctcommon.closedate
 , wh_acctcommon.compoundcalpercd
 , wh_acctcommon.contractdate
 , wh_acctcommon.datelastmaint
 , wh_acctcommon.ownername
 , wh_acctcommon.bankorgnbr
 , wh_acctcommon.intbase
 , wh_acctcommon.intmethcd
 , wh_acctcommon.noteintrate
 , wh_acctcommon.ownersortname
 , wh_acctcommon.loanofficer
 , wh_acctcommon.loanofficersnbr
 , wh_acctcommon.mjaccttypcd
 , wh_acctcommon.managingofficer
 , wh_acctcommon.managingofficernbr
 , AARP.persnbr  AS           'SBB_Portfolio_Mgr_Nbr'
 , PV.fullname      as              'SBB_Portfolio_Mgr'
 , AARP.persnbr   AS        'Orig_Loan_Officer_Nbr'
 , PV.fullname      AS            'Orig_Loan_Officer'
 , AARP.persnbr      as      'Collection_Officer_Nbr'
 , PV.fullname    AS              'Collection_Officer'
 , wh_acctcommon.datemat
 , wh_acctcommon.intminbalamt
 , wh_acctcommon.intmincalcbaltypcd
 , wh_acctcommon.monthendyn
 , wh_acctcommon.notemtdavgbal
 , wh_acctcommon.nameaddr1
 , wh_acctcommon.nameaddr2
 , wh_acctcommon.nameaddr3
 , wh_acctcommon.nameaddr4
 , wh_acctcommon.nameaddr5
 , wh_acctcommon.notenextratechangedate
 , wh_acctcommon.noteopenamt
 , wh_acctcommon.originatingperson
 , wh_acctcommon.origpersnbr
 , wh_acctcommon.bookbalance
 , wh_acctcommon.businessphone
 , wh_acctcommon.homephone
 , wh_acctcommon.currmiaccttypcd
 , wh_acctcommon.product
 , wh_acctcommon.calcbaltypcd
 , wh_acctcommon.noteratechangecalpercd
 , wh_acctcommon.daysmethcd
 , wh_acctcommon.noteintcalcschednbr
 , wh_acctcommon.ratetypcd
 , wh_acctcommon.primaryownerstate
 , wh_acctcommon.curracctstatcd
 , wh_acctcommon.curracctstateffdate
 , wh_acctcommon.taxidnbr
 , wh_acctcommon.taxrptfororgnbr
 , wh_acctcommon.taxrptforpersnbr
 , wh_acctcommon.currterm
 , wh_acctcommon.primaryownerzipcd
 , wh_acctcommon.primaryownerzipcdsuff


 FROM

                                                   [DNA_Staging].[dbo].[WH_ACCTCOMMON]                    wh_acctcommon

     LEFT OUTER JOIN                 [DNA_Staging].[dbo].orguserfield OUF

                                                                       ON wh_acctcommon.branchorgnbr   =   OUF .orgnbr
                                                                       and upper(OUF.userfieldcd) IN( 'WREG','WBRN','WBRS','WHBN','WSIZ','WDIV')

   LEFT OUTER JOIN                          [DNA_Staging].[dbo].userfieldvalue              UFV

                                                                       ON OUF.userfieldcd  = UFV.userfieldcd
                                                                       and OUF.value  = UFV.userfieldvalue

   LEFT OUTER JOIN                          [DNA_Staging].[dbo].[ACCTACCTROLEPERS]          AARP

                                                                       ON wh_acctcommon.acctnbr                 = AARP.acctnbr
                                                                       and upper(AARP.acctrolecd) IN ('PMGR','OLOF','COFF')

   LEFT OUTER JOIN                   [DNA_Cleanup_DM].[dbo].PERSVIEW                        PV

                                                                       ON AARP.persnbr = PV.persnbr

【问题讨论】:

使用此网站格式化您的查询sqlformat.org 这不是代码翻译服务。如果您遇到特定问题,请发布必要的最少代码以重现该问题,清楚地解释问题,并提出与该问题相关的特定问题请将大量格式错误的代码从一种 SQL 方言移植到另一种 SQL 方言中,这不是一个可以接受的问题。 【参考方案1】:

这主要是关于将 SQL99 之前的 Oracle 专有连接转换为 SQL99 连接。与其尝试转换您的实际代码,不如提供一些建议:

from 子句中的表数在两个查询中应该完全相同相同。如果一个表在原始查询中被列出 5 次(带有别名),那么在修改后的查询中应该有相同的 5 个实例。修改后的查询的一个致命缺陷是您试图使用in 来折叠这些关系。您根本无法做到这一点并保留原始查询的含义。 从第一个表开始向下工作,将原始from 子句中的每个逗号转换为on。 如果原始where 子句中的关系包含外部连接指示符((+)),则该关系必须进入外部表的on 子句。例如,a.a = b.a(+) 必须变为 left join b on a.a = b.a

【讨论】:

以上是关于从 Oracle 转换为 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

将表数据类型从 SQL Server 转换为 Oracle 并将动态 SQL 数据插入到表数据类型

将数据从 oracle sql plus 导出到 csv 时,Hypen 转换为问号

是否可以将数据库从 Approach 转换为 Access、SQL Server 或 Oracle / 其他?

将 SQL Server 存储过程转换为 Oracle 过程以从表中查询

将 oracle.sql.TIMESTAMPTZ 转换为字符串值的问题

什么 Oracle 数据类型可以通过 SSIS 在 SQL 中轻松转换为 BIT?