2016-12-20 1 views
0

특정 클라이언트 계정에 대한 시퀀스 번호를 설정하기 위해 호출되는 저장 프로 시저가 있습니다. 간단한 표는 모든 클라이언트에 대해 마지막으로 발행 된 값을 저장하며 SP는 SupplyChainID의 매개 변수와 필요한 숫자의 수를 취합니다.변수 테이블 이름이있는 저장 프로 시저 내에서 매개 변수가있는 쿼리의 값 사용

GetItemIDs

그래서 너무

5를 반환 한 후 다음

205에 값을 설정합니다 12345,200

GetItemIDs를 실행, 마지막으로 발행 수가 5가있을 수 있습니다 12345 SupplyChainID

현재 SP는 99,999,999를 초과하지 않는지 확인해야하므로 이와 같은 작업을 수행합니다.

IF (SELECT EIBItemID FROM ItemIDGeneration WHERE SupplyChainID = @SCID) + @DocumentCount > 99999999 
    BEGIN 
     SELECT 0 
     UPDATE dbo.ItemIDGeneration SET EIBItemID = @DocumentCount, 
             LastIssuedDate = getdate() WHERE SupplyChainID = @SCID  
END 
ELSE 
    BEGIN 
     SELECT EIBItemID FROM ItemIDGeneration WHERE SupplyChainID = @SCID 
     UPDATE dbo.ItemIDGeneration SET EIBItemID = EIBItemID + @DocumentCount, 
             LastIssuedDate = getdate() WHERE SupplyChainID = @SCID 
END 

는 내가 추가 할 필요하면 해당이 더 높은 값을 가지고 있으며,이 경우 대신 마지막 발행 번호 하나를 사용할 수 있는지 확인하기 위해 다른 테이블의 체크입니다 (이 이상 갈 것입니다 경우 0으로 돌아갑니다)

SELECT @HI_ID = MAX(EIBItemID) from 
(SELECT EIBItemID FROM ItemIDGeneration WHERE SupplyChainID = @SCID 
UNION ALL 
SELECT ISNULL(MAX(EIBItemID),0) AS EIBItemID FROM dbo.SupplyChainID_'+ @tablename) as bigint 
    IF (@HI_ID) + @DocumentCount > 99999999 
     BEGIN 
      SELECT 0 
      UPDATE dbo.ItemIDGeneration SET [email protected],LastIssuedDate = getdate() WHERE SupplyChainID = @SCID   END 
    ELSE 
      BEGIN 
     SELECT @HI_ID--EIBItemID FROM ItemIDGeneration WHERE SupplyChainID = @SCID 
     UPDATE dbo.ItemIDGeneration SET EIBItemID = @HI_ID [email protected],LastIssuedDate = getdate() WHERE SupplyChainID = @SCID 
    END 

당신이 테이블에 테이블 이름의 일부와 같은 SupplyChainID을 가지고 볼 수 있듯이 그래서 내가 쿼리의 일부로에 전달해야합니다 알고 다음 ItemGeneration 테이블에서

뭔가 같은 임원하지만 일할 다음을 얻을 수 없다.

SET @tablename = 'dbo.SupplyChain_'[email protected] 
SET @tablequery = N'SELECT ISNULL(MAX(EIBItemID),0) AS EIBItemID FROM ' + @tablename 

execute @tableID = sp_executesql @tablequery 

SELECT @HI_ID = MAX(EIBItemID) from 
(SELECT EIBItemID FROM ItemIDGeneration WHERE SupplyChainID = @SCID 
union all 
SELECT @tableID) as bigint 
IF (@HI_ID) + @DocumentCount > 99999999 

과정은 오류하지 않습니다하지만 난 내가

declare @return int 
    exec @return = GetItemIDs 8001377,20 
    select @return as result 
내가 EIBItemID이 dbo.SupplyChain_xxxxx 테이블에서 올바른 결과로 반환 참조

하지만, 다음 실행 때와 같이 내 구문 뭔가 잘못 생각 sp의 끝에서 리턴 값은 ItemIDGeneration 테이블을 기반으로 한 응답입니다 (200을 반환).

나는이 눈에 띄게 간부가 호출 될 때 올바른 결과를 반환하지만 @tableid에 0을 저장하는 생각

답변

0

감사합니다, I 알렉스의 제안을 작은 조정으로 사용했습니다.

DECLARE @HI_ID as bigint 
DECLARE @TableName NVARCHAR(100) = N'dbo.SupplyChain_' + CAST(@SCID AS NVARCHAR(10)) 
DECLARE @TableID BIGINT 
DECLARE @TableQuery NVARCHAR(1000) = N'SELECT @TableID = ISNULL(MAX(EIBItemID),0) FROM ' + @TableName 

EXEC sp_ExecuteSql @TableQuery, N'@TableID BIGINT OUTPUT', @TableID OUTPUT 

SELECT @TableID As EIBItemID 
1
당신은 값을 얻기 위해이 시도 할 수

: 대답 그 모든

DECLARE @SCID INT = 1 
DECLARE @TableName NVARCHAR(100) = N'dbo.SupplyChain_' + CAST(@SCID AS NVARCHAR(10)) 
DECLARE @TableID BIGINT 
DECLARE @TableQuery NVARCHAR(1000) = N'SELECT @TableID = ISNULL(MAX(EIBItemID), 0) FROM ' + @TableName 

EXEC sp_ExecuteSql @TableQuery, N'@TableID BIGINT OUTPUT', @TableID OUTPUT 

PRINT @TableID 
+0

감사합니다. 작은 조정만으로 작동합니다. – Colster

관련 문제