2016-12-23 2 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 

Где я ошибся - любые идеи? Я попытался объявить идентификатор, как @ ID1, как varchhar, но он не работает

+0

Сначала вы должны подстроить пакет PackId или сказать удалить PK из ID, прежде чем добавить его в ID1 –

ответ

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 вместо @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 заявлении у вас есть логика, как показано ниже:

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

и значения PackID также изменяться от @ 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) 

Как я неспособен изменить выше ответ. поэтому я добавляю новый ответ, пожалуйста, обратитесь к этому.

Смежные вопросы