【发布时间】:2020-07-06 20:16:47
【问题描述】:
这是我的代码:
CREATE TABLE IF NOT EXISTS Artfacture
(
N int(6) unsigned NOT NULL,
Code varchar(50) NOT NULL,
Ht Numeric NOT NULL
)
INSERT INTO Artfacture (N, Code, Ht)
VALUES ('1', '1', '10'), ('1', '2', '20'),('1', '3', '30');
CREATE TABLE IF NOT EXISTS Facture
(
N int(6) unsigned NOT NULL,
Ht Numeric NOT NULL
)
INSERT INTO Facture (N, Ht)
VALUES ('1', '60');
CREATE TABLE IF NOT EXISTS Article
(
Code varchar(50) NOT NULL,
Famille varchar(50) NOT NULL
)
INSERT INTO Article (Code, Famille)
VALUES ('1', 'F1'), ('2', 'F2'), ('3', 'F3');
CREATE TABLE IF NOT EXISTS Farticle
(
Designation varchar(50) NOT NULL,
Compte varchar(50) NOT NULL
)
INSERT INTO Farticle (Designation, Compte)
VALUES ('F1', '700000'), ('F2', '710000'), ('F3', '720000');
CREATE TABLE IF NOT EXISTS Ecritures
(
Date Date,
Pièce varchar(50) NOt NULL,
Compte varchar(50) NOT NULL,
Aux varchar(50),
Libelle varchar(100) NOT NULL,
Débit numeric NOT NULL
Crédit numeric NOT NULL
)
我的请求是一个触发器,其中在表Facture 中添加、更新或删除一些新行,它必须在Ecritures 中添加、更新、删除行数与Artfacture 相同的行
CREATE TRIGGER [dbo].[tr_Facture]
ON [dbo].[Facture]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @dat AS date,
@piece AS nvarchar(10),
@piece1 AS nvarchar(10),
@de money, @cr money,
@code AS nvarchar(255),
@compte AS nvarchar(50),
@Aux AS nvarchar(50),
@lib AS nvarchar(50),
@Famille AS nvarchar(255)
SET @de = 0
SET @Aux = ''
SET @piece = (SELECT [N] FROM inserted)
SET @piece1= (SELECT [N] FROM deleted)
SET @dat = (SELECT [Date] FROM [dbo].[Facture] WHERE [N] = @piece)
SET @lib = 'FACTURE DE VENTE - ' + (SELECT [Societe] FROM [dbo].[Facture] WHERE [N] = @piece)
SET @Compte = (SELECT F.CompteV FROM Artfacture AF
INNER JOIN Article A ON A.Code = AF.Code
INNER JOIN Farticle F ON F.Designation = A.Famille
WHERE N = @piece)
set @Cr = (select AF.Ht from Artfacture AF inner join Article A on A.Code = AF.Code where N = @piece)
begin
IF EXISTS(SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted )
insert into F_Ecritures (Date,Piece,Compte,Auxiliere,Libelle,Débit,Crédit)
select @dat,@piece,F.CompteV,@Aux,@lib,@de, AF.Ht
from Artfacture AF
inner join F_Article A on A.Code = AF.Code
inner join F_Farticle F on F.Designation = A.Famille
where N = @piece
group by F.CompteV, AF.Ht;
ELSE IF EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted)
update Ecritures set Date=@dat,Piece=@piece,Compte=@compte,Auxiliere=@Aux,Libelle=@lib,Débit=@de,Crédit=@cr where Piece=@piece and Compte=@Compte
ELSE IF NOT EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted)
DELETE FROM [dbo].[Ecritures] WHERE Piece = @piece1
end
问题是我收到子请求返回多个值的错误.....
谁能帮帮我?
【问题讨论】:
-
第一个代码肯定不是 T-SQL,而第二个是 T-SQL。那么你真正使用的 rdbms 是什么?
-
触发器是高度特定于供应商的 - 所以请添加标签以指定您使用的是
mysql、postgresql、sql-server、oracle还是db2- 或完全不同的东西。 -
是sqlserver,对不起
-
触发器针对整个更新集运行,而不是针对每一行。所以这条线将失败
SET @piece = (SELECT [N] FROM inserted),因为插入的很可能包含超过 1 行。 -
请问如何解决?
标签: sql-server triggers