从Oracle迁移到SQL Server

时间:2015-02-16 14:04:29

标签: sql sql-server plsql

我用Oracle编写了以下查询

delete from EQUI_HIERARCHY; 

select max(level) into v_max_depth 
from EQUIP_D

connect by prior EQUIP_NO=PARENT_EQUIP_NO 
start with PARENT_EQUIP_NO is null; 

如何将其转换为SQL Server?

1 个答案:

答案 0 :(得分:1)

实现递归查询的SQL标准方法,如IBM DB2和SQL Server是WITH子句。有关将CONNECT BY转换为WITH(技术上是递归CTE)的一个示例,请参阅this article - 该示例适用于DB2,但我相信它也适用于SQL Server。

SQL Server,IBM DB2或PostgreSQL 8.4(以及SQL标准中,为了它的价值;-),完全等效的解决方案是一个递归查询(更复杂的语法,但实际上,甚至更多的力量和灵活性):

    WITH n(v_max_depth ) AS 
         (SELECT max(level)
          FROM EQUIP_D
          WHERE PARENT_EQUIP_NO IS NULL
               UNION ALL
          SELECT max(level)
          FROM EQUIP_D as nplus1, n
          WHERE n.EQUIP_NO= nplus1.PARENT_EQUIP_NO)

   SELECT max(v_max_depth) FROM n

Oracle的START WITH子句成为第一个嵌套SELECT,递归的基本情况,是UNIONed,递归部分只是另一个SELECT

SQL的特定版本的WITH当然记录在MSDN上,它也为使用此关键字提供了指导和限制,以及几个示例。