2017-01-03 120 views
2

我有一个存储过程在一个图案中插入数据,转换失败

DECLARE @I INT = 1 
DECLARE @ID INT = 0 
DECLARE @PackID VARCHAR(50) 

SELECT @PackID = MAX(PackID) 
FROM tblPacks 
WHERE PackID LIKE 'PK%' 

IF(@String = 'Packs') 
BEGIN 
    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, BlistersCount) 
      VALUES (@T_ID, @BatchNumber, 
        'PK'+ CAST(@ID as VARCHAR(50)), 0, 
        (SELECT NumberOfBlistersInEachPack 
        FROM tblPackDetails 
        WHERE T_ID = @T_ID AND BatchNumber = @BatchNumber)) 
     END   
     ELSE 
     BEGIN 
      SET @I = @I + 1 
      error :- SELECT @ID = (SELECT MAX(PackID) FROM tblPacks) 
      SET @ID = @ID + 1 

      INSERT INTO tblPacks (T_ID, BatchNumber, PackID, Status, BlistersCount) 
      VALUES (@T_ID, @BatchNumber, 
        'PK'+ CAST(@ID as VARCHAR(50)), 0, 
        (SELECT NumberOfBlistersInEachPack 
         FROM tblPackDetails 
         WHERE T_ID = @T_ID AND BatchNumber = @BatchNumber)) 
      END 
     END 
    END 
END 

它是否显示错误:

Conversion failed when converting the varchar value 'PK3' to data type int.

如果packid为null,那么它应该是'PK1',如果它有一些数据,那么它会取最大值,然后它应该增加'1'。我应该在哪里修改我的代码以摆脱此错误?

+0

SUBSTRING最大在'table' tblPacks是什么'datatype'的'column' PackID? – Abhishek

+0

Varchar数据类型@Abhishek –

回答

3

尝试把下面的语句进行插入查询

('PK'+CAST(@ID as VARCHAR(50))) 

这里我们首先需要转换成整数类型为varchar,然后拼接它。

+0

获取相同的错误 –

+0

DId您声明@string为varchar或int?请在你的问题中包括声明陈述。你也可以在你的问题中包含带有数据类型的tblPacks列。还包括tblPackDetails列T_ID,BatchNumber数据类型。 – User

+0

T_ID INT, BatchNumber VARCHAR(30), tblPacks计数INT,字符串VARCHAR(30)和PackID as VARCHAR(100)@Srinath –

0

试试这个,一旦它可以帮助你。 首先将整型变量转换为字符串,然后与字符串变量连接。 查询中的INT加入这个块,并享受..

'PK'+ CAST(@ID as VARCHAR(50))
DECLARE @I INT=1 
     DECLARE @ID INT=0 
     DECLARE @PackID VARCHAR(50) 


    SELECT @PackID=MAX(PackID) FROM tblPacks WHERE PackID LIKE 'PK%' 

    IF(@String='Packs') 
    BEGIN 
    WHILE @I<[email protected] 
    BEGIN 
    IF @PackID IS NULL 
    BEGIN 
    SET @[email protected]+1 
    SET @[email protected]+1 
    INSERT INTO tblPacks (T_ID,BatchNumber,PackID,Status,BlistersCount) 
    VALUES (
     @T_ID,@BatchNumber, 
    'PK'+ CAST(@ID as VARCHAR(50)) ,0,(SELECT NumberOfBlistersInEachPack FROM tblPackDetails WHERE [email protected]_ID AND [email protected])) 

    END 

    ELSE 
    BEGIN 
    SET @[email protected]+1 
    SELECT @ID=(SELECT MAX(PackID) FROM tblPacks) 
    SET @[email protected]+1 
    INSERT INTO tblPacks (T_ID,BatchNumber,PackID,Status,BlistersCount) 
    VALUES (
     @T_ID,@BatchNumber, 
     'PK'+ CAST(@ID as VARCHAR(50)) ,0,(SELECT NumberOfBlistersInEachPack FROM tblPackDetails WHERE [email protected]_ID AND [email protected])) 
    END 
    END 
    END 
END 
+0

获取相同的错误 –

0

你也可以你一些字符串函数来转换为varchar,例如:

DECLARE @ID INT =100 
SELECT 'PK'+LTRIM(@ID) 
+0

获取相同的错误 –

0

请注明线#在其中你得到错误。这只是一个转换错误。请指定表格定义。参考下面的查询。我改变了连接部分。如果错误仍然存​​在,请分享表格定义和错误的行号#。另请参阅tblPacks中的PackID列的数据类型是什么? PackID是非数字,您试图将该值分配给@ID,该值声明为INT。这就是问题。我强烈建议使用其他值而不是采用字符串的最大值。我又修改了查询以从PackID

DECLARE @I INT = 1 
DECLARE @ID INT = 0 
DECLARE @MaxPackID VARCHAR(50) 
DECLARE @PackID VARCHAR(50) 


SELECT @PackID = MAX(PackID) 
FROM tblPacks 
WHERE PackID LIKE 'PK%' 

IF(@String = 'Packs') 
BEGIN 
    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, BlistersCount) 
      VALUES (@T_ID, @BatchNumber, 
        'PK' + CAST(@ID AS VARCHAR(50)), 0, 
        (SELECT NumberOfBlistersInEachPack 
        FROM tblPackDetails 
        WHERE T_ID = @T_ID AND BatchNumber = @BatchNumber)) 
     END   
     ELSE 
     BEGIN 
      SET @I = @I + 1 
      SELECT @MaxPackID = MAX(SUBSTRING(PackID,PATINDEX('%[0-9]%',PackID),LEN(PackID))) FROM tblPacks 
      SELECT @ID = @MaxPackID 
      SET @ID = @ID + 1 

      INSERT INTO tblPacks (T_ID, BatchNumber, PackID, Status, BlistersCount) 
      VALUES (@T_ID, @BatchNumber, 
        'PK' + CAST(@ID AS VARCHAR(50)), 0, 
        (SELECT NumberOfBlistersInEachPack 
         FROM tblPackDetails 
         WHERE T_ID = @T_ID AND BatchNumber = @BatchNumber)) 
      END 
     END 
    END 
END 
+0

这是越来越错误在这里︰SELECT @ID =(SELECT MAX(PackID)FROM tblPacks)和PackID是VARCHAR –

+0

更新请再检查一次 –

+0

@saibharath:这将工作时'PK'是在每个ID值之前附加的唯一字符串,否则我们可能需要重新调整查询。 –