SQL Server使用OPENJSON与JOIN时返回转换失败错误如何处理?
报错原因
- 核心错误出在参数合法性校验逻辑:
ISNULL(@JsonIds, 0) = 0这行代码中,@JsonIds是NVARCHAR字符串类型,0是INT整数类型,SQL Server执行比较时会优先尝试把字符串隐式转换为INT类型,你传入的[1,4]无法转为合法INT值,直接触发转换失败报错。 - 额外风险点:
OPENJSON返回的value字段默认是NVARCHAR(4000)类型,和INT类型的Id字段关联时如果存在非数字值也可能触发转换错误,建议显式转换类型避免隐式转换隐患。
修复后的存储过程代码
CREATE OR ALTER PROCEDURE [MySP] @JsonIds NVARCHAR(200) -- JSON Array of Ids. AS BEGIN -- 修正校验逻辑:先判断是否为NULL/空字符串,再校验JSON合法性 IF (@JsonIds IS NULL OR LTRIM(RTRIM(@JsonIds)) = N'' OR ISJSON(@JsonIds) = 0) BEGIN RAISERROR('Invalid JSON parameter.', 16, 1) RETURN END SELECT T.* FROM MyTable T -- 显式把JSON返回值转为INT类型,消除隐式转换风险 INNER JOIN OPENJSON(@JsonIds) AS Ids ON T.Id = CAST(Ids.value AS INT); END
调用验证
执行以下语句即可正常返回结果:
EXEC [MySP] @JsonIds=N'[1,4]';
内容的提问来源于stack exchange,提问作者Cheshire Cat
相关产品推荐
相关产品推荐

