2016-12-23 115 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) 

,因为我无法编辑上面的回答。所以我添加新的答案请参考这一个。