将存储过程从 Firebird 移动到 SQL 服务器的方法

Way for moving stored procedure from Firebird to SQL Server

我在 Firebird 上有工作 SP,但找不到将代码转换为 MS SQL 服务器 SP

的方法

代码如下:

我有一个 table 可以从中获取数据。 一个名为 "iznos" 的字段用于数据汇总,一个字段用于按类别汇总的识别差异

create or alter procedure SOME_PROCEDURE (  
      B_Date date,  
      E_Date date)  

returns(  
      Dat date,  
      Value1 decimal(18,2),  
      Value2 decimal(18,2),  
      Value3 (18,2))  
AS  

BEGIN  
    FOR   
    SELECT gk.date  
    FROM gk 
    WHERE  
        gk.date BETWEEN :B_Date AND :E_Date  
    GROUP BY 1  
    INTO :Dat  
    DO  
    BEGIN  
        /* Value 1 */  
        SELECT sum(iznos) from gk where gk.category=1 and gk.datum=:Dat  
        INTO :Value1;  
        /* Value 2 */  
        SELECT sum(iznos) from gk where gk.category=2 and gk.datum=:Dat  
        INTO :Value2;  
        /* Value 3 */  
        SELECT sum(iznos) from gk where gk.category=3 and gk.datum=:Dat  
        INTO :Value3;  
        suspend;  
    end  
end  

您可以使用 PIVOT:

来解决这个问题
select datum, [1] as Value1, [2] as Value2, [3] as Value3
from (
    select datum, category, iznos 
    from gk 
    where datum between @B_Date AND @E_Date 
) as src
pivot (
    sum(src.iznos)
    for src.category in ([1], [2], [3])
) as pvt

虽然这与 Firebird 存储过程没有完全相同的效果,因为它为 gk 中的每一行返回一行。如果您想获得完全相同的结果,您可能需要将 gk 加入上述查询。

如果您打算在 select 中使用此存储过程(这在 Firebird 中是可能的,但在 SQL 服务器中则不行),那么您需要将其转换为 table-valued user-defined function.

您也可以改为创建视图。在这种情况下,需要删除 where 子句。

T中的小例子SQL:

create table #example (
   datum date,
   category int,
   val int
);

insert into #example(datum, category, val) values
    ('2015-07-24', 1, 1),
    ('2015-07-24', 2, 1),
    ('2015-07-24', 3, 1),
    ('2015-07-24', 1, 1),
    ('2015-07-24', 2, 1),
    ('2015-07-25', 3, 1);

select datum, [1] as Value1, [2] as Value2, [3] as Value3
from (
    select datum, category, val 
    from #example 
) as src
pivot (
    sum(src.val)
    for src.category in ([1], [2], [3])
) as pvt;

drop table #example;