Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 将存储过程从Firebird移动到SQL Server的方法_Sql Server 2008_Stored Procedures_Firebird - Fatal编程技术网

Sql server 2008 将存储过程从Firebird移动到SQL Server的方法

Sql server 2008 将存储过程从Firebird移动到SQL Server的方法,sql-server-2008,stored-procedures,firebird,Sql Server 2008,Stored Procedures,Firebird,我在Firebird上使用了SP,但找不到将代码转换为MS SQL server SP的方法 代码如下: 我有一个表可以从中获取数据。 一个名为iznos的字段用于数据汇总,另一个字段用于按类别识别汇总的差异 create or alter procedure SOME_PROCEDURE ( B_Date date, E_Date date) returns( Dat date, Value1 decimal(18,2),

我在Firebird上使用了SP,但找不到将代码转换为MS SQL server SP的方法

代码如下:

我有一个表可以从中获取数据。 一个名为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  
您可以使用以下方法解决此问题:

不过,这与Firebird存储过程的效果并不完全相同,因为这将为gk中的每一行返回一行。如果希望得到完全相同的结果,可能需要将gk加入到上述查询中

如果您打算在一个select中使用此存储过程,这在Firebird中是可能的,但在SQL Server中是不可能的,那么您需要将其转换为

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

TSQL中的小示例:

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;

谢谢你,伙计!我需要创建一个存储过程,它为两个日期(例如,B_日期和E_日期)之间的每个日期返回一行。@Slavica由于缩进,我错过了所选零件的存储过程。您可以很容易地更改PIVOT示例来实现这一点。我将很快更新我的答案。此代码正在运行,但仅当我删除代码第一行中的基准,并且表格中没有基准列时。有了这段代码,我在编译窗口上出现错误,消息是:多部分标识符dbo.GK.DATUM无法绑定。@slavica它在SQL Server 2012上对我很好。我添加了一个我使用的TSQL示例。@Mark Rotterveel-我的错!我需要按日期分组的结果。无论如何,谢谢。你帮了我很多,节省了我对付你的时间。再次感谢。
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;