Подзапрос вернул более 1 значения. Это не разрешено, когда следует подзапрос =, !=, <, , >= или

#sql-server

#sql-server

Вопрос:

мой код:

 create table customers
(
customer_id int not null identity primary key,
customer_fname char(50) not null,
customer_lname char(50) not null,
customer_CodeMeli int not null unique,
branch_code int not null,
total_debt int not null,
debt_month int not null,
number_paid int not null,
total_remaining int not null,
number_remaining int not null,
constraint fk_customers foreign key(branch_code) references branch(branch_code)
)

create table branch
(
branch_code int not null primary key identity,
branch_name char(50) not null unique,
total_remaining int not null,
)
create table kasr_bd
(
n_id int not null primary key identity,
n float
)
create procedure sp_updatekasr_bd  @n float 
as
begin
      insert into kasr_bd values (@n)
end
    create trigger kasr_bdupdate on kasr_bd after insert
    as
    begin
           update customers set total_remaining = total_remaining - (((select n from inserted) * total_remaining)/100)
           update branch set total_remaining = total_remaining - (((select n from inserted) * total_remaining)/100)       
    end

sp_updatekasr_bd 12
  

Любая помощь приветствуется. Спасибо

Комментарии:

1. Ваш триггер ошибочен, он предполагает, что INSERT содержит 1 строку. Вредные привычки для устранения: злоупотребление триггерами

2. у меня это сработало нормально. dbfiddle.uk /…

3. Нет, @PurveshSangani , это не то, что должна делать операция… Им необходимо перейти на решение на основе набора… Это «решение» может ухудшить ситуацию, а не улучшить, поскольку оно скрывает реальную основную проблему.

4. Каковы ваши ожидаемые результаты здесь? Чего вы пытаетесь достичь с помощью этого триггера? Должен ли триггер действительно обновлять значение каждой строки? Если это так, то, похоже, у вас есть недостаток дизайна, поскольку повторение одного и того же значения в каждой строке таблицы подразумевает, что оно не должно храниться в этой таблице.

5. Ваша последняя правка не имеет никакого смысла. Вы не можете определить TRIGGER внутри хранимой процедуры. Кроме того, sp_ префикс зарезервирован Корпорацией Майкрософт и означает S ecial P rodure; его не следует использовать для пользовательской хранимой процедуры. Это может привести к тому, что ваш объект не будет работать после обновления и приведет к проблемам с производительностью. Является ли префикс sp_ по-прежнему отрицательным?

Ответ №1:

Не прямой ответ на ваш вопрос (как ваш подход является ошибочным), но вы должны рассмотреть индексированное представление , чтобы вычислить остальные значения из заголовка записи, а сумма любых позиций.

Это обеспечивает лучшую целостность данных, поскольку вы не можете изменять результаты из представления, отключая триггеры или изменяя значение напрямую.

Он также выполняет ваши операции set без проблем, чего не делает ваш триггер (но мог бы).