Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
berry555
Member

Откуда:
Сообщений: 31
Вот триггеры:
Create trigger insert_зак on Заказ
after insert
as
begin
declare @a int
declare @b int
set @a=(select Количество from inserted )
set @b=(select Товар.Количество_на_складе from Товар, inserted where Товар.Код_товара=inserted.Код_товара) 
 if @a>@b
begin
raiserror ('Количество товара на складе меньше запрашиваемого',16,1)
rollback transaction
end
end

create trigger Формирование_количество_товары on Заказ
for update,insert
as
begin
declare @a int
declare @b int
declare @c int
set @a=(select Код_заказа from inserted)
set @c=(select Количество from inserted)
set @b=(select Товар.Цена from Товар, Заказ where Товар.Код_товара=Заказ.Код_заказа and Товар.Код_товара=@a)
update  Заказ set Стоимость=@c*@b where Код_товара=@a
end

Create trigger insert_отнимает on Товар 
for insert 
as 
begin 
declare @b int 
declare @c int 
set @b=(select Код_товара from inserted)  
set @c=(select Количество from Заказ) 
update Товар set Количество_на_складе = (select Количество from Заказ, inserted where Товар.Код_товара=inserted.Код_товара)-@c where Код_товара=@b 
end
24 июн 17, 21:41    [20588331]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
И что вам не понятно из текста ошибки?
24 июн 17, 21:48    [20588336]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
berry555
Member

Откуда:
Сообщений: 31
Гавриленко Сергей Алексеевич,
С ошибкой все понятно, но я не знаю как ее исправить
24 июн 17, 21:50    [20588342]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
berry555
Гавриленко Сергей Алексеевич,
С ошибкой все понятно, но я не знаю как ее исправить
Писать ваши subquery с учетом того, что они могут вернуть боелее "than 1 value" же.
Кто вас надоумил, что в inserted будет не более одной записи?

Сообщение было отредактировано: 24 июн 17, 21:52
24 июн 17, 21:51    [20588344]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
berry555
Member

Откуда:
Сообщений: 31
Гавриленко Сергей Алексеевич,
никто, просто помогите исправить ошибку
24 июн 17, 21:54    [20588349]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36686
berry555
Гавриленко Сергей Алексеевич,
никто, просто помогите исправить ошибку
Ошибку поможет исправить осознание того, что в insrted может быть сколько угодно записей. Ну, еще про join следует почитать.

Сообщение было отредактировано: 24 июн 17, 22:01
24 июн 17, 21:57    [20588353]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
berry555
Гавриленко Сергей Алексеевич,
С ошибкой все понятно, но я не знаю как ее исправить
Уберите все ваши переменные, перепишите "update Заказ" на прямое использование таблиц inserted, Товар, Заказ
25 июн 17, 01:34    [20588500]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
aleks2
Guest
berry555
Гавриленко Сергей Алексеевич,
никто, просто помогите исправить ошибку


Create trigger insert_зак on Заказ
after insert
as
begin

if not exists( select * from inserted  as i left outer join Товар as t on t.Код_товара = i.Код_товара where i.Количество > isnull( t.Количество, 0 ) ) return;

declare @msg as nvarchar(1024) = N'Недостаточно товара ' 
                                                 + isnull( ( select cast( i.Код_товара as nvarchar(16) )  from inserted  as i inner join Товар as t on t.Код_товара = i.Код_товара where i.Количество > isnull( t.Количество, 0 ) ), '???' )

throw 66666, @msg, 1;
  
end;


create trigger Формирование_количество_товары on Заказ
for update,insert
as
begin

update  z set Стоимость = i.Количество *  t.Цена
   from Заказ as z 
          inner join inserted as i on i.Код_заказа = z.Код_заказа
          inner join Товар as t on t.Код_товара = i.Код_товара;

end;
25 июн 17, 10:33    [20588688]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
aleks2
Guest
Пардон

Create trigger insert_зак on Заказ
after insert
as
begin

if not exists( select * from inserted  as i left outer join Товар as t on t.Код_товара = i.Код_товара where i.Количество > isnull( t.Количество, 0 ) ) return;

declare @msg as nvarchar(1024) = N'Недостаточно товара ' 
                                                 + isnull( ( select top(1) cast( i.Код_товара as nvarchar(16) )  from inserted  as i  left outer join Товар as t on t.Код_товара = i.Код_товара where i.Количество > isnull( t.Количество, 0 ) ), '???' )

throw 66666, @msg, 1;
  
end;
25 июн 17, 10:37    [20588694]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
berry555
Member

Откуда:
Сообщений: 31
aleks2,
При выполнении триггера
Create trigger insert_зак on Заказ
after insert
as
begin

if not exists( select * from inserted  as i left outer join Товар as t on t.Код_товара = i.Код_товара where i.Количество > isnull( t.Количество, 0 ) ) return;

declare @msg as nvarchar(1024) = N'Недостаточно товара ' 
                                                 + isnull( ( select top(1) cast( i.Код_товара as nvarchar(16) )  from inserted  as i  left outer join Товар as t on t.Код_товара = i.Код_товара where i.Количество > isnull( t.Количество, 0 ) ), '???' )

throw 66666, @msg, 1;
  
end;

Пишет ошибку: Неправильный синтаксис около конструкции "throw".
25 июн 17, 16:29    [20588907]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30702
berry555
Пишет ошибку: Неправильный синтаксис около конструкции "throw".
Может, версия не поддерживает?
Когда задаёте вопрос, пишите, для какой версии.
25 июн 17, 16:32    [20588910]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
berry555
Member

Откуда:
Сообщений: 31
alexeyvg,
Microsoft SQL Server Management Studio 10.0.1600.22 ((SQL_PreRelease).080709-1414 )
25 июн 17, 16:56    [20588938]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
invm
Member

Откуда: Москва
Сообщений: 9114
berry555
Неправильный синтаксис около конструкции "throw".
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/throw-transact-sql
The statement before the THROW statement must be followed by the semicolon (;) statement terminator.

И вообще, ресурсы сервера нужно расходовать бережно:
create trigger insert_зак on Заказ
after insert
as
begin
 set nocount on;

 declare @msg as nvarchar(1024) = N'Недостаточно товара ' 
   + isnull( ( select top(1) cast( i.Код_товара as nvarchar(16) )  from inserted  as i  left outer join Товар as t on t.Код_товара = i.Код_товара where i.Количество > isnull( t.Количество, 0 ) ), '???' );
 
 if @@rowcount = 0
  return;

 throw 66666, @msg, 1;
end;
25 июн 17, 16:57    [20588939]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
invm
Member

Откуда: Москва
Сообщений: 9114
berry555
Microsoft SQL Server Management Studio 10.0.1600.22 ((SQL_PreRelease).080709-1414 )
Жуть...

Вместо throw; напишите raiserror(@masg, 16, 1);
25 июн 17, 17:00    [20588943]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
berry555
Member

Откуда:
Сообщений: 31
invm,
та же ошибка
25 июн 17, 17:01    [20588946]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
berry555
Member

Откуда:
Сообщений: 31
invm,
Заменил throw на raiserror(@masg, 16, 1);
Теперь ссылается на Недопустимое имя столбца "Количество"
25 июн 17, 17:06    [20588961]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
invm
Member

Откуда: Москва
Сообщений: 9114
berry555
Теперь ссылается на Недопустимое имя столбца "Количество"
Ну так замените на реальное наименование столбца.
25 июн 17, 17:10    [20588973]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
invm
berry555
Неправильный синтаксис около конструкции "throw".
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/throw-transact-sql
The statement before the THROW statement must be followed by the semicolon (;) statement terminator.

И вообще, ресурсы сервера нужно расходовать бережно:
create trigger insert_зак on Заказ
after insert
as
begin
 set nocount on;

 declare @msg as nvarchar(1024) = N'Недостаточно товара ' 
   + isnull( ( select top(1) cast( i.Код_товара as nvarchar(16) )  from inserted  as i  left outer join Товар as t on t.Код_товара = i.Код_товара where i.Количество > isnull( t.Количество, 0 ) ), '???' );
 
 if @@rowcount = 0
  return;

 throw 66666, @msg, 1;
end;
Однако, @@ROWCOUNT в триггере лучше не использовать из-за возможного MERGE
25 июн 17, 17:15    [20588978]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
invm
Member

Откуда: Москва
Сообщений: 9114
iap
Однако, @@ROWCOUNT в триггере лучше не использовать из-за возможного MERGE
Да. На входе триггера для проверки вхолостую вызван триггер или нет.

В данном коде чем @@rowcount плох?
25 июн 17, 17:44    [20589014]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
invm
iap
Однако, @@ROWCOUNT в триггере лучше не использовать из-за возможного MERGE
Да. На входе триггера для проверки вхолостую вызван триггер или нет.

В данном коде чем @@rowcount плох?
В MERGE выполнится DELETE, - и никакого RETURN не будет!
25 июн 17, 19:33    [20589113]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
invm
Member

Откуда: Москва
Сообщений: 9114
iap
В MERGE выполнится DELETE, - и никакого RETURN не будет!
И почему же не будет, если в inserted пусто?
25 июн 17, 20:00    [20589138]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
invm
iap
В MERGE выполнится DELETE, - и никакого RETURN не будет!
И почему же не будет, если в inserted пусто?
Потому что после MERGE запускаются все триггеры,
а @@ROWCOUNT равно общему количеству записей, затронутых MERGE.
Если выполнился только DELETE одной записи, то @@ROWCOUNT будет равен 1,
а триггеры на INSERT будут всё равно вызваны.
26 июн 17, 11:33    [20590073]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
invm
Member

Откуда: Москва
Сообщений: 9114
iap
Потому что после MERGE запускаются все триггеры,
а @@ROWCOUNT равно общему количеству записей, затронутых MERGE.
Если выполнился только DELETE одной записи, то @@ROWCOUNT будет равен 1,
а триггеры на INSERT будут всё равно вызваны.
Ок, спрошу по-другому: Какую опасность представляет в триггере @@rowcount, если это не первая интсрукция триггера?
26 июн 17, 11:50    [20590132]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
invm
iap
Потому что после MERGE запускаются все триггеры,
а @@ROWCOUNT равно общему количеству записей, затронутых MERGE.
Если выполнился только DELETE одной записи, то @@ROWCOUNT будет равен 1,
а триггеры на INSERT будут всё равно вызваны.
Ок, спрошу по-другому: Какую опасность представляет в триггере @@rowcount, если это не первая интсрукция триггера?

DECLARE ж всегда 1 вернёт, в чём смысл проверять на 0?
26 июн 17, 12:05    [20590171]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при использовании триггеров: Subquery returned more than 1 value  [new]
iap
Member

Откуда: Москва
Сообщений: 46951
invm
iap
Потому что после MERGE запускаются все триггеры,
а @@ROWCOUNT равно общему количеству записей, затронутых MERGE.
Если выполнился только DELETE одной записи, то @@ROWCOUNT будет равен 1,
а триггеры на INSERT будут всё равно вызваны.
Ок, спрошу по-другому: Какую опасность представляет в триггере @@rowcount, если это не первая интсрукция триггера?
В этом смысле я неправ.
26 июн 17, 12:10    [20590187]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить