2016-07-16 8 views
0

저장 프로 시저에 여러 기능이 있습니다.SQL Server 저장 프로 시저 C에서 매개 변수 입력으로 한 필드 합계

단계 : I 사용자 입력 인 @int 변수 테이블에서 int, SUM를 검색 할 필요가있다. 그런 다음 해당 값을 검색 한 동일한 열에 다시 저장하십시오. I.E. 우리는 하나를 가지고 있고, 하나를 주문하고 하나를 추가합니다. 왜냐하면 그 아이템이 이미 재고에 있기 때문에 우리는 이제 두 개를 가지고 있기 때문입니다.

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 (이 열에 하나와 사용자가 QRY 결과 창에서 1 = 2를 입력

오류 : 여기

내가 지금까지 가지고 무엇을 내가 얻을 :

이 컬럼에 NULL 값을 삽입 할 수 없습니다 'InvTotalQtyOnHand', 테이블 'TrackLinq.dbo.InventoryMaster_tbl'; 열이 null을 허용하지 않습니다 UPDATE가 실패

..

은 분명히 InvTotalQtyOnHand 그렇게 좋은 여기 Null@TotalOnHand = null 이후

첫 번째 게시물이된다. 나는 수년간이 위치를 연구했다 ... 나는 그것이 어떻게 일 수 있는지 알고있다 : 나는 당신 모두를 위해 충분히 간결했다는 것을 희망한다.

미리 감사드립니다.

+0

BEGIN을 코드 블록의 일부로 만들려면 빈 줄이 필요합니다. – evaitl

답변

0

,

Update [InventoryMaster_tbl] 
Set InvTotalQtyOnHand = ISNULL(@TotalOnHand,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은 null을 허용하지 않는 null 열이 아닙니다. 따라서 @TotalOnHand가 null인지 검사 할 수 있습니다. 그렇다면 null 대신에 0을 삽입하십시오. ISNULL (Transact-SQL)

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 = no 기본값 = 0 InvManPartNumber = non-clusterindex = yes. "필드는 고유해야합니다"InvTotalQtyOnHand –