【发布时间】:2016-02-15 07:12:07
【问题描述】:
当我执行存储过程时,我得到这个错误:
消息 8114,级别 16,状态 5,过程 SPXML,第 158 行
将数据类型 varchar 转换为数值时出错。
我是第一次使用存储过程和游标。
这是我的存储过程:
CREATE PROCEDURE [dbo].[SPXML]
(@CounterStockMaster text,
@CounterStockDetails text,
@CounterStock text)
AS
DECLARE @M0 VARCHAR(100) --EditStatus
DECLARE @M1 VARCHAR(100) --Counter_Code
DECLARE @M2 VARCHAR(100) --Counter_Name
DECLARE @M3 VARCHAR(100) --To Branch_Code
DECLARE @D1 VARCHAR(100) --Project Type
DECLARE @D2 VARCHAR(100) --drpC.Text
DECLARE @D3 VARCHAR(100) --grdGO.Rows[i].Cells["1"].Value
DECLARE @D4 VARCHAR(100) --grdGO.Rows[i].Cells["2"].Value
DECLARE @D5 VARCHAR(100)
DECLARE @C1 VARCHAR(100) --Cnt Code
DECLARE @C2 VARCHAR(100) --Item
DECLARE @C3 VARCHAR(100) --Qty
BEGIN
DECLARE @CNTNo VARCHAR(100)
DECLARE @idoc INT
DECLARE @INDate Datetime
DECLARE @Branch_Code NUMERIC(18,0)
DECLARE @ItemCode NUMERIC(18,0)
DECLARE @ItemQty NUMERIC(18,3)
DECLARE @PurRate NUMERIC(18,2)
DECLARE @SaleRate NUMERIC(18,2)
DECLARE @MRP NUMERIC(18,2)
DECLARE @PurDate DATETIME
DECLARE @Batch_No VARCHAR(50)
DECLARE @ExpiryDate DATETIME
DECLARE @MultiMRP BIT
BEGIN TRANSACTION
SET DATEFORMAT dmy
SET @MultiMRP = (Select ISNULL(Multiple_Mrp,0) from [Company])
EXEC sp_xml_preparedocument @idoc OUTPUT, @CounterStockMaster
DECLARE GINMasterCursor CURSOR FOR
SELECT * FROM OPENXML (@idoc, '/CSMASTER/ID',1)
WITH (M0 VARCHAR(100), M1 VARCHAR(100), M2 VARCHAR(100),M3 VARCHAR(100))
OPEN GINMasterCursor
FETCH NEXT FROM GINMasterCursor INTO @M0,@M1,@M2,@M3
IF @M0='T' ---Edit Mode TRUE
BEGIN --- Reversing the Item Stock for the Editing Sales START
SET @CNTNo = @M1
DECLARE GInDetailCursor CURSOR FOR
SELECT Counter_Stock_Code,Item_Code,Item_Qty,Branch_Code From [CntDetails]
WHERE Counter_Stock_Code = @CNTNo AND Branch_Code=@M3
OPEN GInDetailCursor
FETCH NEXT FROM GInDetailCursor INTO @CNTNo,@ItemCode,@ItemQty,@Branch_Code
WHILE @@FETCH_STATUS=0
BEGIN
IF @MultiMRP = 0
UPDATE [ITEM] SET ITEM_BAL = ITEM_BAL - @ItemQty , Transfer_flag=2, Ascend_flag=1 WHERE Item_Code = @ItemCode and Type_Code = 0 and Branch_Code = @M3
ELSE
UPDATE [ITEM] SET ITEM_BAL = ITEM_BAL - @ItemQty , Transfer_flag=2, Ascend_flag=1 WHERE Item_Code = @ItemCode and Item_MRP = @MRP and Type_Code = 0 and Branch_Code = @M3
FETCH NEXT FROM GInDetailCursor INTO @CNTNo,@ItemCode,@ItemQty,@Branch_Code
END
CLOSE GInDetailCursor
DEALLOCATE GInDetailCursor
END --- Reversing the Item Stock for the Editing GO END
ELSE
BEGIN
SET @CNTNo = (SELECT ISNULL(MAX(Counter_Stock_Code)+1,1) FROM [Counter Stock Master] where Branch_Code = @M3)
END
INSERT INTO [CntMaster]
(Counter_Stock_Code,Counter_Stock_Date,Branch_Code)
VALUES
(@CNTNo, @INDate, @M3)
CLOSE GINMasterCursor
DEALLOCATE GINMasterCursor
EXEC sp_xml_removedocument @idoc
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @CounterStockDetails
-- Execute a SELECT statement using OPENXML rowset provider.
DECLARE GInDetailsCursor CURSOR FOR
SELECT * FROM OPENXML (@idoc, '/CSDETAILS/ID',1)
WITH ( D1 VARCHAR(100), D2 VARCHAR(100), D3 VARCHAR(100), D4 VARCHAR(100))
OPEN GInDetailsCursor
FETCH NEXT FROM GInDetailsCursor INTO @D1,@D2,@D3,@D4
WHILE @@FETCH_STATUS = 0
BEGIN
IF @D1='A' or @D1='D' --For ProjectType ==> Departmental Stores
BEGIN
SET @D2 = @CNTNo
INSERT INTO [CntDetails]
(Counter_Stock_Code,Item_Code,Item_Qty,Branch_Code)
VALUES
(@D2, @D3, @D4, @M3)
IF @MultiMRP = 0
UPDATE [ITEM] SET ITEM_BAL = ITEM_BAL + @D4 , Transfer_flag=2, Ascend_flag=1 WHERE Item_Code = @D3 and Type_Code = 0 and Branch_Code = @M3
ELSE
UPDATE [ITEM] SET ITEM_BAL = ITEM_BAL + @D4 , Transfer_flag=2, Ascend_flag=1 WHERE Item_Code = @D3 and Type_Code = 0 and Branch_Code = @M3
END
FETCH NEXT FROM GInDetailsCursor INTO @D1,@D2,@D3,@D4
END
CLOSE GInDetailsCursor
DEALLOCATE GInDetailsCursor
***[EXEC sp_xml_removedocument @idoc ----------------------- "I get this error from this line"][1]***
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @CounterStock
-- Execute a SELECT statement using OPENXML rowset provider.
DECLARE CSCursor CURSOR FOR
SELECT * FROM OPENXML (@idoc, '/CounterStock/ID',1)
WITH ( D1 VARCHAR(100), D2 VARCHAR(100), D3 VARCHAR(100), D4 VARCHAR(100))
OPEN CSCursor
FETCH NEXT FROM CSCursor INTO @D1,@D2,@D3,@D4
WHILE @@FETCH_STATUS = 0
BEGIN
IF @D1='A' or @D1='D' --For ProjectType ==> Departmental Stores
BEGIN
INSERT INTO [CntStock]
(Conter_Code,Item_Code,Item_Qty)
VALUES
(@D2, @D3, @D4)
IF @MultiMRP = 0
UPDATE [ITEM] SET ITEM_BAL = ITEM_BAL + @D4 , Transfer_flag=2, Ascend_flag=1 WHERE Item_Code = @D3 and Type_Code = 0 and Branch_Code = @M3
ELSE
UPDATE [ITEM] SET ITEM_BAL = ITEM_BAL + @D4 , Transfer_flag=2, Ascend_flag=1 WHERE Item_Code = @D3 and Type_Code = 0 and Branch_Code = @M3
END
FETCH NEXT FROM CSCursor INTO @D1,@D2,@D3,@D4
END
CLOSE CSCursor
DEALLOCATE CSCursor
EXEC sp_xml_removedocument @idoc
SELECT @CNTNo
COMMIT TRANSACTION
END
GO
我试了很多次都没有解决这个问题。
有人有什么建议吗?
【问题讨论】:
-
您能否突出显示上面代码中第 158 行的位置?
-
@TimBiegeleisen 这段代码有 155 行。
-
所以基本上行号给了我们零洞察力,因为 SQL 只是告诉我们“proc 中某处存在转换错误”。很有启发性^^
-
可能是连接 ITEM_BAL + @D4,其中 bal 是数字,表变量是字符
标签: sql-server tsql stored-procedures