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

Откуда:
Сообщений: 54
всем привет ещё раз

создаю процедуру. в случае если я покупаю продукт - делаю инсерт в Сайл, и этот продукт не находится на складе в Продуктс, про процедура автоматически сажает его в Продуктс.
Если такой продукт уже существует в Продуктс, то делается обычный инсерт в Сейл, а в Продуктс добавляется количество продукта.

проблема в том что до когда у меня один всего лишь продукт в Продуктс, всё прекрасно работает, и при инсерте в Сейл, добавляется количество продукта в Продуктс. Но если я делаю ВТОРОЙ инсерт в Прудуктс, то ест ьу меня появляются 2 продукта в Продуктс, или не получается после делать инсерты в Сейл, или при инсерте в Сейл у всех продуктов в Продуктс становится одинаковое количество.

Прошу помочь, думаю дело в какой то маленькой ошибке в синтаксе, но найти не смог и понять.
Заранее спасибо


CREATE TABLE Products
(
Products_ID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
name NVARCHAR(100),
description NVARCHAR(100),
sklad INT,
price decimal(19,2)
)


CREATE TABLE Sales
(
Sales_ID INT NOT NULL PRIMARY KEY IDENTITY(1,1),
Product_ID int,
name NVARCHAR(100),
description NVARCHAR(100),
price int ,
kol-vo INT,
CreateDate DATETIME DEFAULT GETDATE()
)





Create procedure InsertSales (@Product_ID int, @name nvarchar(100), @description nvarchar(100), @price int, @kol-vo int)
AS
begin 


 if @Product_ID = 0 or @Product_ID is null
 begin
  insert into Sales (name, description, kol-vo, price) values (@name, @description, @kol-vo, @price)
  insert into Products (name, description, sklad, price) values (@name, @description, @kol-vo, @price)
   
    END
 else
 BEGIN
  insert into Sales (Product_ID, name, description, kol-vo, price) values (@Product_ID, @name, @description, @kol-vo, @price) 
  UPDATE Products set sklad=(select sklad from Products where @Product_ID=(select Products_ID from Products)) + @kol-vo
   
 end


END;
go


exec InsertSales @Product_ID='1', @name='RG-32', @description='Camera', @kol-vo='11', @price='10';
go 

exec InsertSales @Product_ID='2', @name='BM-31', @description='DVR', @kol-vo='15', @price='10';
go


Сообщение было отредактировано: 17 июл 12, 13:58
17 июл 12, 13:53    [12877672]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с процедурой  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
У вас ошибка в коде.

Вот тут:
UPDATE Products set sklad=(select sklad from Products where @Product_ID=(select Products_ID from Products)) + @kol-vo


Сообщение было отредактировано: 17 июл 12, 13:59
17 июл 12, 13:58    [12877710]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с процедурой  [new]
alex212121
Member

Откуда:
Сообщений: 54
Гавриленко Сергей Алексеевич,

Спасибо, я знаю что что-то там, и на сколько понимаю с where, надо как-то что-то переставить, не подскажете
17 июл 12, 14:05    [12877762]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с процедурой  [new]
qwer234
Guest
if @Product_ID = 0 or @Product_ID is null


наверно вот так будет лучше

if isnull(@Product_ID, 0) = 0 
17 июл 12, 14:07    [12877774]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с процедурой  [new]
qwer234
Guest
alex212121
Гавриленко Сергей Алексеевич,

Спасибо, я знаю что что-то там, и на сколько понимаю с where, надо как-то что-то переставить, не подскажете


подзапрос

(select Products_ID from Products)) вернет первую попавшуюся запись в таблице

заменить его весь на @Product_ID - вы же передаете его в параметре
17 июл 12, 14:16    [12877835]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с процедурой  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
qwer234
подзапрос

(select Products_ID from Products)) вернет первую попавшуюся запись в таблице
Это почему это???

И вообще, всё в процедуре просто чудовищно.
Чего стоит UPDATE поля sklad всей таблицы Products, который ещё неизвестно, сработает ли.
17 июл 12, 14:23    [12877898]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с процедурой  [new]
qwer234
Guest
iap
qwer234
подзапрос

(select Products_ID from Products)) вернет первую попавшуюся запись в таблице
Это почему это???

И вообще, всё в процедуре просто чудовищно.
Чего стоит UPDATE поля sklad всей таблицы Products, который ещё неизвестно, сработает ли.


Да, точно. Там все обновится, а не случайная запись. Тяжело эту строку анализировать :))


Т.С., вот правельный вариант

UPDATE Products set sklad= sklad + @kol-vo where Products_ID = @Product_ID
17 июл 12, 14:28    [12877936]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с процедурой  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
qwer234
iap
пропущено...
Это почему это???

И вообще, всё в процедуре просто чудовищно.
Чего стоит UPDATE поля sklad всей таблицы Products, который ещё неизвестно, сработает ли.


Да, точно. Там все обновится, а не случайная запись. Тяжело эту строку анализировать :))
Ничего подобного.
Будет ошибка с сообщением, что нельзя использовать оператор = с подзапросом, который возвращает более одной строки.
17 июл 12, 14:33    [12877966]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с процедурой  [new]
qwer234
Guest
iap
qwer234
пропущено...


Да, точно. Там все обновится, а не случайная запись. Тяжело эту строку анализировать :))
Ничего подобного.
Будет ошибка с сообщением, что нельзя использовать оператор = с подзапросом, который возвращает более одной строки.


тогда надо in вместо =
17 июл 12, 14:37    [12877994]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с процедурой  [new]
alex212121
Member

Откуда:
Сообщений: 54
qwer234,

UPDATE Products set sklad= sklad + @kol-vo where Products_ID = @Product_ID

это работает. нет никаких ошибок
17 июл 12, 14:46    [12878054]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с процедурой  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
alex212121
qwer234,

UPDATE Products set sklad= sklad + @kol-vo where Products_ID = @Product_ID

это работает. нет никаких ошибок
А первоначальный-то UPDATE без всякого WHERE потрошил всю таблицу!

Это не преступление. Это хуже. Это ошибка! © Жозеф Фуше
17 июл 12, 15:15    [12878273]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить