在sql server中时的请求不起作用

toe95027  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(475)

这是我的密码:

  1. CREATE TABLE IF NOT EXISTS Artfacture
  2. (
  3. N int(6) unsigned NOT NULL,
  4. Code varchar(50) NOT NULL,
  5. Ht Numeric NOT NULL
  6. )
  7. INSERT INTO Artfacture (N, Code, Ht)
  8. VALUES ('1', '1', '10'), ('1', '2', '20'),('1', '3', '30');
  9. CREATE TABLE IF NOT EXISTS Facture
  10. (
  11. N int(6) unsigned NOT NULL,
  12. Ht Numeric NOT NULL
  13. )
  14. INSERT INTO Facture (N, Ht)
  15. VALUES ('1', '60');
  16. CREATE TABLE IF NOT EXISTS Article
  17. (
  18. Code varchar(50) NOT NULL,
  19. Famille varchar(50) NOT NULL
  20. )
  21. INSERT INTO Article (Code, Famille)
  22. VALUES ('1', 'F1'), ('2', 'F2'), ('3', 'F3');
  23. CREATE TABLE IF NOT EXISTS Farticle
  24. (
  25. Designation varchar(50) NOT NULL,
  26. Compte varchar(50) NOT NULL
  27. )
  28. INSERT INTO Farticle (Designation, Compte)
  29. VALUES ('F1', '700000'), ('F2', '710000'), ('F3', '720000');
  30. CREATE TABLE IF NOT EXISTS Ecritures
  31. (
  32. Compte varchar(50) NOT NULL,
  33. Ht numeric NOT NULL
  34. )

我的请求是一个触发器,在表facture中添加一些新行时,它必须在ecritures中添加与artfacture行数相同的行

  1. declare @piece as nvarchar(50), @code as nvarchar(50)
  2. declare @rowCount int = 0, @currentRow int = 1
  3. select @rowCount = count(*) from ArtFacture where N = @piece;
  4. while (@currentRow <= @rowCount)
  5. begin
  6. set @Code = (select code from ArtFacture where N = @piece)
  7. set @compte = (select Compte from Farticle where Designation = (select Famille from Article where code = @code))
  8. set @Ht = (select ht from ArtFacture where N = @piece)
  9. insert into Ecritures (Compte,Ht)
  10. values (@compte,@Ht)
  11. end

我有一个错误,但我不知道在哪里?

suzh9iv8

suzh9iv81#

您犯了一个典型的错误,即试图编写过程性t-sql,而不是sql服务器优化的基于集的t-sql。
如果我遵循你的逻辑 insert 不再需要 while 回路:

  1. insert into Ecritures (Compte, Ht)
  2. select F.Compte, AF.Ht
  3. from Artfracture AF
  4. inner join Article A on A.Code = AF.Code
  5. inner join Farticle F on F.Designation = A.Famille
  6. where N = @piece;

如果你不想要复制品,加一个 group by :

  1. insert into Ecritures (Compte, Ht)
  2. select F.Compte, AF.Ht
  3. from Artfracture AF
  4. inner join Article A on A.Code = AF.Code
  5. inner join Farticle F on F.Designation = A.Famille
  6. where N = @piece
  7. group by F.Compte, AF.Ht;
展开查看全部

相关问题