将存储过程从 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;
我在 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;