2013-03-04 17 views
1

我们正在从Oracle迁移到SQL Server,并且正在使用填充了BULK COLLECT INTO查询的表变量转换查询。我正在考虑使用游标(绝对开放给其他建议),但是在处理查询的Oracle代码中,它使用Table_var.FIRST.NEXT.LAST。这里有一些示例代码如何使用它们。看起来,第一个/下一个/最后一个将索引赋予表的var记录。Oracle收集方法的T-SQL等价物(第一个,最后一个,下一个)?

TYPE Pers_DOB_LastInitial IS RECORD (
    Person_ID Person.Person_ID%TYPE, 
    DOB Person.Birthdate%TYPE, 
    LastInitial VARCHAR2(1) 
); 

TYPE Dup_Table IS TABLE OF Pers_DOB_LastInitial INDEX BY BINARY_INTEGER; 

Dup_Tab Dup_Table; 

,并使用这些类型的函数:

FUNCTION Last_In_Group(pStart NUMBER, pDOB Person.Birthdate%TYPE, pLastInitial VARCHAR2) 
    RETURN NUMBER IS 
    vResult NUMBER; 
BEGIN 
    IF pStart = Dup_Tab.LAST THEN 
    RETURN pStart; 
    END IF; 

    vResult := pStart; 

    FOR vIndex IN pStart .. Dup_Tab.LAST LOOP 
    IF Dup_Tab.EXISTS(vIndex) THEN 
     IF Dup_Tab(vIndex).DOB = pDOB AND Dup_Tab(vIndex).LastInitial = pLastInitial THEN 
      vResult := vIndex; 
     ELSE 
      EXIT; 
     END IF; 
    END IF; 
    END LOOP; 

    RETURN vResult; 
END Last_In_Group; 

我不需要为我做的编码,只需要在正确的方向指向。我正在考虑使用游标,但我唯一熟悉的仅仅是从T-SQL中的游标获取下一条记录,并希望查看是否有等效的方式来引用游标(或临时表)的行索引)。


编辑:我刚刚发现下面,我期待到它。对于这是一条好的追求路径还是游标仍然更好,绝对可以提示。

http://www.sql-server-performance.com/2004/operations-no-cursors/2/

DECLARE @dupTab TABLE (
    person_id numeric(8,0), 
    DOB date, 
    LastInitial char(1) 
) 

INSERT @dupTab 
SELECT ... 

回答

0

不是100%肯定你问什么,但你有没有看新LEADLAGFIRST_VALUELAST_VALUE在SQL Server 2012中的关键字?

+0

不,这是完全不同的东西。 – 2013-03-04 17:25:25

+0

我已经更新了问题(希望)使它更清晰一点,并提供更好的示例代码。 – jinglesthula 2013-03-04 17:35:37

0

假设你的表被称为Dup_Tab,@DOB和@LastInitial是你传递给你的函数的变量,可能这个工作吗?

select PersonID from(
select 
rank = row_number() over (order by DOB DESC, LastInitial DESC), 
PersonID 
from dup_tab where [email protected] and [email protected] 
) subgroup 
where rank=1 

它只是用窗等级()函数来分配每个记录基于DOB/LastInitial行号排序最后,然后再选择秩= 1的行,让你在最后一条记录一组具有特定DOB和LastInitial的人员。

0

我将您的示例代码翻译为它的SQL Server对应部分。如果你想逐行处理,最好的方法是使用FAST_FORWARD游标。

代码:

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[Last_In_Group]') AND xtype in (N'FN', N'IF', N'TF')) 
     drop function Last_In_Group 
    go 

    create function Last_In_Group(@pStart int, @pDOB date, @pLastInitial varchar(1)) 
    returns int 
    AS 
    BEGIN 
     DECLARE @Dup_Tab TABLE(
      Person_ID int, 
      DOB date, 
      LastInitial varchar(1) 
     ) 
     -- populate the table with some data 
     insert @Dup_Tab values 
     (1, '31.12.2013', 'P'), (2, '24.12.2013', 'C'), (3, '24.12.2013', 'C') 

     declare @vResult int = 0, 
       @cDOB date, 
       @cLastInitial varchar(1) 

     if(@vResult = @pStart) return @pStart 
     set @vResult = @pStart 

     -- loop over your data with a fast cursor 
     declare cur cursor FAST_FORWARD for select DOB, LastInitial from @Dup_Tab 
     open cur 
     fetch next from cur 
     into @cDOB, @cLastInitial 

     while @@FETCH_STATUS = 0 
     begin 
      if(@cDOB = @pDOB and @cLastInitial = @pLastInitial) 
       set @vResult += 1 
      fetch next from cur 
      into @cDOB, @cLastInitial 
     end 

     return @vResult; 
    end 
    go 

    print dbo.Last_In_Group(1, '24.12.2013', 'C') 
    go 

它可能无法正常工作,你的样品上,但我希望这给你一些提示,其中走得更远。

相关问题