Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 我想知道如何将Oracle触发器转换为SQL Server触发器_Sql Server_Oracle - Fatal编程技术网

Sql server 我想知道如何将Oracle触发器转换为SQL Server触发器

Sql server 我想知道如何将Oracle触发器转换为SQL Server触发器,sql-server,oracle,Sql Server,Oracle,据我所知,SQL SERVER触发器不支持每一行。另外,我知道您必须使用插入表和删除表。除此之外,我不知道如何编写SQL Server触发器。他们看起来很不一样。能帮点忙吗 下面是Oracle触发器的代码 create or replace TRIGGER Ten_Percent_Discount BEFORE INSERT OR UPDATE ON Bookings FOR EACH ROW DECLARE CURSOR C_Passengers IS SELECT StatusN

据我所知,SQL SERVER触发器不支持每一行。另外,我知道您必须使用插入表和删除表。除此之外,我不知道如何编写SQL Server触发器。他们看起来很不一样。能帮点忙吗

下面是Oracle触发器的代码

create or replace TRIGGER Ten_Percent_Discount   
BEFORE INSERT OR UPDATE ON Bookings  
FOR EACH ROW
DECLARE CURSOR C_Passengers IS 
SELECT StatusName
FROM   Passengers
WHERE  PassengerNumber = :NEW.Passengers_PassengerNumber;
l_status_name Passengers.StatusName%TYPE;
BEGIN 
OPEN  C_Passengers;
FETCH C_Passengers INTO l_status_name;
CLOSE C_Passengers;
以下是我到目前为止所写的内容。我知道我用错了插入的表

IF l_status_name = 'Regular' 
THEN 
 :New.TotalCost := 0.90 * :New.TotalCost;
END IF;
END;

create TRIGGER Ten_Percent_Discount  
ON Customer
FOR INSERT ,UPDATE  
AS 
DECLARE  C_Passengers CURSOR FOR
SELECT StatusLevel
FROM   Customer
WHERE  CustomerID = inserted.CustomerID
提前谢谢你的帮助

面向客户的表结构

订单的表结构


以下答案仅供参考,可用于逐步构建最终解决方案:

create table dbo.customer
(
customerid varchar(10),
firstname nvarchar(50),
statuslevel varchar(50)
)
go
create table dbo.customerorder
(
orderid varchar(10),
totalprice numeric(5,2),
productid varchar(10),
customerid varchar(10)
)
go
go
create trigger dbo.tr_customer on dbo.customer for insert,update
as
begin
    update co
    set co.totalprice = .9*co.totalprice
    from dbo.customerorder co
    inner join inserted i
    on co.customerid = i.customerid
    where i.statuslevel = 'Standard' 
end
go

--test for above code
insert into dbo.customer values (1,'jayesh','')
insert into dbo.customerorder values (1,500.25,1,1)
insert into dbo.customerorder values (1,600.25,2,1)
select * from dbo.customer
select * from dbo.customerorder

update dbo.customer set statuslevel = 'Standard' where customerid = 1

select * from dbo.customer
select * from dbo.customerorder

但我非常确定的是,当第一次创建客户时,将不会有任何订单应用折扣,因此您肯定也需要更新触发器。

我可以知道您为什么要在“客户”上编写sql server触发器吗表oracle触发器何时在预订表上?@JayeshPrakash是的,因为它们是不同的表,但触发器的工作逻辑相同。谢谢,你介意在你的问题中发布表格结构和你对插入和删除案例的确切要求吗?@JayeshPrakash你只需要我的表格的屏幕打印吗?截图?触发要求是,如果客户的状态为标准,则我希望触发,这将在订单中提供总价10%的折扣。Creenshot也可以工作,此外,在删除的情况下,触发器应该做什么?如果我要给客户提供5%的折扣,我是否需要添加另一个if语句?您可以在触发器更新中使用case语句。类似于“设置co.totalprice=CASE i.statuslevel当'Standard'时,然后是9当'Regular'时,然后是5否则1结束*co.totalprice”。同样在这种情况下,不要忘记删除where子句。参考啊,干杯,伙计!!我被困在这上面有一段时间了。非常感谢你在正确的道路上给予的帮助。非常感谢@杰耶什