2016-12-23 184 views
0

我有一個存儲過程:我哪裏錯了?

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[spInsertNewPacks] 
    @T_ID INT OUT, 
    @BatchNumber VARCHAR(30) OUT, 
    @Count INT OUT 
AS 
BEGIN 
    DECLARE @I INT = 1 
    DECLARE @ID INT = 0 
    DECLARE @ID1 VARCHAR(50) 
    DECLARE @PackID VARCHAR(50) 

    SELECT @PackID = MAX(PackID) 
    FROM tblPacks 

    WHILE @I <= @Count 
    BEGIN 
     IF @PackID IS NULL 
     BEGIN 
      SET @I = @I + 1 
      SET @ID = @ID + 1 

      INSERT INTO tblPacks (T_ID, BatchNumber, PackID, Status) 
      VALUES (@T_ID, @BatchNumber, 
        CAST(('PK'+ (CASE WHEN len(@ID) <=3 THEN CAST(RIGHT(0.001 * @ID, 3) AS VARCHAR(20)) ELSE CAST(@ID AS VARCHAR(20)) END)) as VARCHAR(50)), 0) 
     END 
     ELSE 
     BEGIN 
      SELECT @ID1 = CONVERT(VARCHAR(50), MAX(PackID)) FROM tblPacks 
      SET @I = @I + 1 
      SET @ID = @ID + 1 

      SELECT MAX(PackID) as ID FROM tblPacks 

      INSERT INTO tblPacks (T_ID, BatchNumber, PackID, Status) 
      VALUES (@T_ID, @BatchNumber, 
        --CAST(('PK'+ (CASE WHEN len(@ID1) <=3 THEN CAST(RIGHT(0.001*@ID1, 3) AS VARCHAR(20)) ELSE CAST(@ID1 AS VARCHAR(20)) END)) as VARCHAR(50)) 
        ('PK'+ (CASE WHEN len(@ID1) <=3 THEN CAST(RIGHT(0.001*@ID1, 3) AS VARCHAR(20)) ELSE CAST(@ID1 AS VARCHAR(20)) END)), 0) 
     END 
    END 
END 

然後我寫道:

EXEC spInsertNewPacks 1, '101', 4 

,並得到這樣的輸出:

T_ID BatchNumber PackID Status 
1 101 PK001 0 
1 101 PK002 0 
1 101 PK003 0 
1 101 PK004 0 

它工作正常,但是當我又寫了EXEC命令:

EXEC spInsertNewPacks 2, '102', 3 

我越來越:

T_ID BatchNumber PackID Status 
1   101 PK001 0 
1   101 PK002 0 
1   101 PK003 0 
1   101 PK004 0 
2   102 PKPK004 0 
2   102 PKPKPK004 0 
2   102 PKPKPKPK004 0 

但它必須是:

T_ID BatchNumber PackID Status 
    1   101 PK001 0 
    1   101 PK002 0 
    1   101 PK003 0 
    1   101 PK004 0 
    2   102 PK005 0 
    2   102 PK006 0 
    2   102 PK007 0 

哪兒我去錯 - 任何想法?我想聲明的ID作爲@ ID1作爲varchhar但它沒有工作

+0

您應該首先對PackId進行子串匹配,或者在將ID添加到ID1之前先從ID中刪除PK –

回答

0

在你Else語句,你有如下的邏輯:

SELECT @ID1=CONVERT(VARCHAR(50),MAX(PackID)) FROM tblPacks 

,這將給你的varchar(字符串)值,如:PK004

你「PK」添加它下面,然後後導致到:PKPK004

('PK'+ (CASE WHEN len(@ID1) <=3 THEN CAST(RIGHT(0.001*@ID1, 3) AS VARCHAR(20)) ELSE CAST(@ID1 AS VARCHAR(20)) END)) 

結論:我認爲你必須使用@ID,而不是在else語句@ID1,所以它會給你正確的輸出

2

你只需要改變一個句子是:

SELECT @ID1=CONVERT(VARCHAR(50),MAX(PackID)) FROM tblPacks 

SELECT @ID = CONVERT(VARCHAR(50),MID(MAX(PackID),4)) FROM tblPacks 

而且

CAST(('PK'+ (CASE WHEN len(@ID) <=3 THEN CAST(RIGHT(0.001*@ID, 3) AS VARCHAR(20)) ELSE CAST(@ID AS VARCHAR(20)) END)) as VARCHAR(50)) 

這將爲你工作。

+0

它顯示錯誤「語法不正確」,「。」在線:-SELECT @ID = CONVERT(VARCHAR(50),(CONVERT(VARCHAR(50),MAX(PackID)),0,2))FROM tblPacks –

+0

@saibharath我只是更新了答案。 –

0

在你Else語句,你有如下的邏輯:PackID的

SELECT @ID = CONVERT(VARCHAR(50), replace(MAX(PackID),'PK','')) FROM tblPacks 

和價值觀也從@ ID1改變@ID

('PK'+ (CASE WHEN len(@ID) <=3 THEN CAST(RIGHT(0.001*@ID, 3) AS VARCHAR(20)) ELSE CAST(@ID AS VARCHAR(20)) END)), 0) 

,因爲我無法編輯上面的回答。所以我添加新的答案請參考這一個。