2016-07-16 7 views
0

Хранимая процедура имеет несколько функций.SQL Server хранимая процедура суммирования одного поля с параметром ввода из C#

Шаг первый: Мне нужно получить int из таблицы SUM с переменной @int, введенной пользователем. Затем сохраните это значение обратно в тот же столбец, из которого он был извлечен. И.Е. У нас есть один, мы заказываем один, добавляем один, потому что теперь у нас есть два, потому что этот элемент уже находится в инвентаре.

Вот что я до сих пор:

BEGIN 
SET NOCOUNT ON; 

DECLARE @TotalOnHand INT;  

SELECT (
    Select Sum(TotalOnHand) 
    FROM (Values (InvTotalQtyOnHand), (@InvTotalQtyOnHand)) as TSum(TotalOnHand) 
) 
FROM InventoryMaster_tbl 
INNER JOIN PurchaseOrderItems_tbl PartManufPartNum On PartManufPartNum = InvManPartNumber 
WHERE POItemsID = @POItemsID 
UPDATE [InventoryMaster_tbl] 
SET InvTotalQtyOnHand = @TotalOnHand 

END 

Когда бегала я вижу InvTotalQtyOnHand теперь = 2 (там был один в столбце и пользователь ввел 1 = 2 в окне результатов QRY

Ошибка Я получаю:

не удается вставить значение NULL в столбец «InvTotalQtyOnHand», таблица «TrackLinq.dbo.InventoryMaster_tbl», столбец не допускает пустые значения UPDATE не удается

..

Очевидно InvTotalQtyOnHand становится Null поскольку @TotalOnHand = null

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

Заранее спасибо.

+0

Вам понадобится пустая строка, чтобы BEGIN был частью блока кода. – evaitl

ответ

0

Вы не присвоить значение @TotalOnHand поэтому значение null. Вы можете сделать это следующим образом.

BEGIN 
SET NOCOUNT ON; 

DECLARE @TotalOnHand INT; --newly declared, not assigned. NULL 

SELECT @TotalOnHand = (
    Select Sum(TotalOnHand) 
    FROM (Values (InvTotalQtyOnHand), (@InvTotalQtyOnHand)) as TSum(TotalOnHand) 
) 
FROM InventoryMaster_tbl 
INNER JOIN PurchaseOrderItems_tbl PartManufPartNum On PartManufPartNum = InvManPartNumber 
WHERE POItemsID = @POItemsID 

UPDATE [InventoryMaster_tbl] 
SET InvTotalQtyOnHand = @TotalOnHand -- now assigned 
--you forget filter. All rows will be updated 
where <some condition> 

END 

На самом деле вам не нужно первое select заявление. Вы можете сделать непосредственно update.

UPDATE [InventoryMaster_tbl] 
SET InvTotalQtyOnHand = InvTotalQtyOnHand + @InvTotalQtyOnHand --comes from SP parameters 
FROM InventoryMaster_tbl 
INNER JOIN PurchaseOrderItems_tbl PartManufPartNum On PartManufPartNum = InvManPartNumber 
WHERE POItemsID = @POItemsID --comes from SP parameters 
+0

Как мой сын говорит (ему 16) удивительный соус! Это было, что более важно для меня, я понимаю. Это qry, который имеет несколько условий. Я ценю помощь и уважение, а не ДА, вы смотрите здесь? Я действительно трачу одно чертовски много времени, прежде чем спрашиваю. Еще раз спасибо. Как я могу дать вам ответы на вопросы и ответ? –

0

Столбцы InvTotalQtyOnHand не является нулевым столбцом, что означает, что не допускает нулей. Итак, вы можете проверить, является ли @TotalOnHand нулевым, если да, тогда попробуйте вставить нуль вместо нуля в столбец. Refer ISNULL (Transact-SQL) ниже

Update [InventoryMaster_tbl] 
Set InvTotalQtyOnHand = ISNULL(@TotalOnHand,0) 

Ваш сценарий может быть как ниже,

BEGIN 
SET NOCOUNT ON; 
DECLARE @TotalOnHand INT;  
SELECT 
(Select Sum(TotalOnHand) 
FROM (Values (InvTotalQtyOnHand), (@InvTotalQtyOnHand)) as Sum(TotalOnHand)) 
FROM InventoryMaster_tbl 
INNER JOIN PurchaseOrderItems_tbl PartManufPartNum On PartManufPartNum = InvManPartNumber 
WHERE POItemsID = @POItemsID 

Update [InventoryMaster_tbl] 
Set InvTotalQtyOnHand = ISNULL(@TotalOnHand,0) 

END 
+0

Вероятно, должно быть указано значение столбца/поля по умолчанию для первого сообщения. InvTotalQtyOnHand Разрешить nulls = нет Значение по умолчанию = 0 InvManPartNumber = non-clusterindex = yes. «поле должно быть уникальным» InvTotalQtyOnHand –