sql-server - 将 varchar 值“01-4001”转换为数据类型 int 时转换失败
问题描述
我的存储过程如下:
DECLARE @LOCATION_ID VARCHAR(MAX) = 3,
@INVENTORY_ITEM_ID VARCHAR(MAX) = '01-4001' ,
@CALLFROM VARCHAR(MAX) = 'FRAMES' --Requested by VIkram Dated 29jan 2020 For MBT :- 25401,25402
BEGIN
SET NOCOUNT ON;
BEGIN TRY
DECLARE @TABLE_LOCATION_ID TABLE
(
ID INT,
LOCATION_ID INT
)
INSERT INTO @TABLE_LOCATION_ID
SELECT *
FROM dbo.SPLIT(@LOCATION_ID, ',')
SELECT * FROM @TABLE_LOCATION_ID
DECLARE @TABLE_INVENTORY_ITEM_ID TABLE
(
ID INT,
INVENTORY_ITEM_ID VARCHAR(MAX) -- 2189
)
INSERT INTO @TABLE_INVENTORY_ITEM_ID
SELECT *
FROM dbo.SPLIT(@INVENTORY_ITEM_ID, ',')
SELECT * FROM @TABLE_INVENTORY_ITEM_ID
SELECT DISTINCT LOCATION_ID
FROM @TABLE_LOCATION_ID
IF('FRAMES' = 'FRAMES')
BEGIN
-- declare @LOCATION_ID int ,
--@INVENTORY_ITEM_ID VARCHAR(MAX);
SELECT DISTINCT
I.[UPC_ID],
I.INVENTORY_ITEM_ID,
IP.LOCATION_ID,
PL.LOCATION_NAME,
F.MANUFACTURER,
(CASE WHEN F.BRAND IS NULL THEN '' ELSE F.BRAND END) BRAND,
F.COLOR_NAME,
F.COLOR_TEMPLE,
F.[FRAME_TEMPLE],
F.FRAME_EYE_SIZE,
F.[FRAME_DBL],
F.[COLLECTION] ,
F.MODEL_NO ,
[DESCRIPTION],
IP.RETAIL_PRICE ,
IP.WHOLE_SALE AS WHOLE_SALE_PRICE
FROM
PMS_INVENTORY_ITEM_DETAILS I
INNER JOIN
PMS_INVENTORY_ITEM_PRICING_DETAILS IP ON I.INVENTORY_ITEM_ID = IP.INVENTORY_ITEM_ID
INNER JOIN
PMS_FRAME_SPECIFICATIONS F ON I.INVENTORY_ITEM_ID = F.INVENTORY_ITEM_ID
LEFT JOIN
PRACTICE_LOCATIONS PL ON PL.PRACTICE_LOCATION_ID = IP.LOCATION_ID
LEFT JOIN
[PMS_PURCHASE_ORDER_ITEMS] P ON P.UPC_ID = I.UPC_ID -- MBT#21084 Added by Trupti
LEFT JOIN
[PMS_PURCHASE_ORDERS] PO ON PO. PURCHASE_ORDER_ID = P.PURCHASE_ORDER_ID
WHERE
(IP.LOCATION_ID IN (3) OR @LOCATION_ID IS NULL)
--AND (I.UPC_ID IN (SELECT DISTINCT INVENTORY_ITEM_ID FROM @TABLE_INVENTORY_ITEM_ID ) OR @INVENTORY_ITEM_ID IS NULL)
AND ((I.UPC_ID IN ('01-4001') OR @INVENTORY_ITEM_ID IS NULL)
OR (PO.PO_NO IN (SELECT CAST(DATA AS INTEGER)
FROM dbo.SPLIT(@INVENTORY_ITEM_ID, ',')) OR @INVENTORY_ITEM_ID IS NULL))
AND (I.INVENTORY_CATEGORY = 'FRAMES')
AND (IP.IS_ACTIVE = 1)
AND (I.IS_ACTIVE = 1)
--ORDER BY IP.LAST_SOLD_DATE
--OFFSET (@PAGE_NO - 1) * @PAGE_SIZE ROWS FETCH NEXT @PAGE_SIZE ROWS ONLY
END
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_MESSAGE() AS ErrorMessage;
END CATCH
END
如果我执行上面的整个代码,那么下图显示的输出有错误
将 varchar 值“01-4001”转换为数据类型 int 时转换失败。
但如果只执行选择查询,那么它工作正常。没有错误。
我的数据类型是Varchar(max)
. Inventory_Item_id = '01-4001'
如果我将inventory_item_id 设置为'2189',那么整个执行不会引发错误。
网络中的响应错误,例如:
""error":true,"message":"索引超出范围。必须为非负数且小于集合的大小。\r\n参数名称: index""
在表中的PMS_INVENTORY_ITEM_DETAILS
描述INVENTORY_ITEM_ID
是 int 长度 4,UPC_ID 是varchar
长度 -1。
解决方案
错误发生在这里:
INSERT INTO @TABLE_INVENTORY_ITEM_ID
SELECT * FROM DBO.SPLIT(@INVENTORY_ITEM_ID, ',')
您为 split 函数提供的分隔符是,
而不是-
结果将01-4001
再次出现(而不是预期的01
and 4001
),然后将其转换为整数会失败。
要修复,请-
用作分隔符。
推荐阅读
- flutter - Flutter:如何使用 json 和 listview 导航到新屏幕
- javascript - 关键帧动画的 Vue 和 SCSS 问题
- c++ - 延迟渲染不显示 GBuffer 纹理
- bash - 如何在不解析的情况下在bash中写入文件?
- android - 找不到正确的提供者
在这个 Builder Widget 上方 - android - 如何从 Android 中的 EditText 中删除 getError 消息
- html - 如何在 HTML 网站中包含自定义字体?
- flutter - 我无法从我的颤振/android 工作室项目在我的 android 模拟器上运行我的应用程序。它发生在我在 pubspec 文件夹中添加图像之后
- javascript - 根据唯一测试提取站点地图 URL 和 cy.request() 每个 URL(赛普拉斯)
- r - 如何在 R 中找到两次之间的中间时间,有时是一夜之间,有时是同一天,但我没有日期?