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

Откуда:
Сообщений: 19
Доброго дня.
Microsoft SQL Server
Есть таблица:

CREATE TABLE [dbo].[Mot_Station](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Mot_1] [int] NULL,
    [Mot_2] [int] NULL,
    [Mot_3] [int] NULL,
    [Mot_4] [int] NULL,
    [Mot_5] [int] NULL,
    [Mot_6] [int] NULL,
    [Mot_7] [int] NULL,
    [Mot_8] [int] NULL,
    [Mot_9] [int] NULL,
) ON [PRIMARY]

есть триггер :


ALTER TRIGGER [dbo].[Tr_Delete_All_Exept_Last]
 --  make copy from kep_events to kep_events_day  
    ON [dbo].[Mot_Station]
    AFTER INSERT 
    AS
    BEGIN
set nocount on

 
DECLARE @M_1 INT = (SELECT top(1) [Mot_Station].[Mot_1] from [Mot_Station] order by id desc)
UPDATE [dbo].[Combo] SET [dbo].[Combo].[Station] = @M_1    WHERE [dbo].[Combo].[Mot] = 1;
 
DECLARE @M_2 INT = (SELECT top(1) [Mot_Station].[Mot_2] from [Mot_Station] order by id desc)
UPDATE [dbo].[Combo] SET [dbo].[Combo].[Station] = @M_2    WHERE [dbo].[Combo].[Mot] = 2;
 
DECLARE @M_3 INT = (SELECT top(1) [Mot_Station].[Mot_3] from [Mot_Station] order by id desc)
UPDATE [dbo].[Combo] SET [dbo].[Combo].[Station] = @M_3    WHERE [dbo].[Combo].[Mot] = 3;
 
DECLARE @M_4 INT = (SELECT top(1) [Mot_Station].[Mot_4] from [Mot_Station]order by id desc )
UPDATE [dbo].[Combo] SET [dbo].[Combo].[Station] = @M_4    WHERE [dbo].[Combo].[Mot] = 4;
 
DECLARE @M_5 INT = (SELECT top(1) [Mot_Station].[Mot_5] from [Mot_Station] order by id desc)
UPDATE [dbo].[Combo] SET [dbo].[Combo].[Station] = @M_5    WHERE [dbo].[Combo].[Mot] = 5;
 
DECLARE @M_6 INT = (SELECT top(1) [Mot_Station].[Mot_6] from [Mot_Station] order by id desc)
UPDATE [dbo].[Combo] SET [dbo].[Combo].[Station] = @M_6    WHERE [dbo].[Combo].[Mot] = 6;
 
DECLARE @M_7 INT = (SELECT top(1) [Mot_Station].[Mot_7] from [Mot_Station] order by id desc)
UPDATE [dbo].[Combo] SET [dbo].[Combo].[Station] = @M_7    WHERE [dbo].[Combo].[Mot] = 7;
 
DECLARE @M_8 INT = (SELECT top(1) [Mot_Station].[Mot_8] from [Mot_Station] order by id desc)
UPDATE [dbo].[Combo] SET [dbo].[Combo].[Station] = @M_8    WHERE [dbo].[Combo].[Mot] = 8;
 
DECLARE @M_9 INT = (SELECT top(1) [Mot_Station].[Mot_9] from [Mot_Station] order by id desc)
UPDATE [dbo].[Combo] SET [dbo].[Combo].[Station] = @M_9    WHERE [dbo].[Combo].[Mot] = 9;
 
 
 
DELETE FROM Mot_Station
 
 
END

Иногда срабатывание триггера выскакивает ошибку:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Выловил блок который вызывает ошибку (он все время разный) :

DECLARE @M_3 INT = (SELECT top(1) [Mot_Station].[Mot_3] from [Mot_Station] order by id desc)
UPDATE [dbo].[Combo] SET [dbo].[Combo].[Station] = @M_3    WHERE [dbo].[Combo].[Mot] = 3;

запустил:

DECLARE @M_3 INT = (SELECT top(1) [Mot_Station].[Mot_3] from [Mot_Station] order by id desc)
SELECT @M_3

получил: 32

запустил:

UPDATE [dbo].[Combo] SET [dbo].[Combo].[Station] = 32    WHERE [dbo].[Combo].[Mot] = 3;

тоже сработало. а целиком блок выдает ошибку. Подскажите что не так.
27 ноя 19, 11:34    [22026454]     Ответить | Цитировать Сообщить модератору
 Re: Subquery returned more than 1 value ....  [new]
invm
Member

Откуда: Москва
Сообщений: 9349
1. Показанный код такую ошибку генерить не может.
2. Все это переписывается через один update:
update c
 set
  Station = s.Value
from
 (select top (1) Mot1, Mot2, Mot3, Mot4, Mot5, Mot6, Mot7, Mot8, Mot9 from dbo.Mot__Station order by id desc) ms cross apply
 (
  values
   (1, ms.Mot1), (3, ms.Mot3), (3, ms.Mot3), (4, ms.Mot4), (5, ms.Mot5), (6, ms.Mot6), (7, ms.Mot7), (8, ms.Mot8), (9, ms.Mot9) 
 ) s(Mot, Value) join
 dbo.Combo c on c.Mot = s.Mot;
27 ноя 19, 11:44    [22026472]     Ответить | Цитировать Сообщить модератору
 Re: Subquery returned more than 1 value ....  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
yuri7811,

триггер на Combo скорее всего такой же дикий
27 ноя 19, 11:46    [22026476]     Ответить | Цитировать Сообщить модератору
 Re: Subquery returned more than 1 value ....  [new]
yuri7811
Member

Откуда:
Сообщений: 19
Спасибо, попробую разобраться.
27 ноя 19, 11:51    [22026485]     Ответить | Цитировать Сообщить модератору
 Re: Subquery returned more than 1 value ....  [new]
yuri7811
Member

Откуда:
Сообщений: 19
Спасибо Всем огромное за помощь,

действительно на [dbo].[Combo] есть триггер который отслеживает число 32.

Отключил его и все заработало.

Сейчас попробую оптимизировать код триггера.
27 ноя 19, 14:47    [22026728]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить