Sql server 2008 将存储过程从Firebird移动到SQL Server的方法
我在Firebird上使用了SP,但找不到将代码转换为MS SQL server SP的方法 代码如下: 我有一个表可以从中获取数据。 一个名为iznos的字段用于数据汇总,另一个字段用于按类别识别汇总的差异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),
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;