使用STUFF函数拼接编码时字符串转uniqueidentifier报错如何解决
报错原因
- 核心问题是
IN运算符不支持直接传入逗号拼接的字符串作为多值参数。SQL Server会将整个@Item_List变量视为单个字符串值,尝试将其转换为uniqueidentifier类型与ItemGuid字段比对,而你传入的@Item_List是包含多个GUID、逗号、转义单引号的长文本,无法转换为单个GUID,因此触发类型转换错误。 - 你传入的
@Item_List参数自带转义单引号(''),也无法直接参与GUID匹配,需要先做清洗处理。
实现期望输出的修改方案
SQL Server 2016及以上版本可以直接使用内置的STRING_SPLIT函数拆分字符串,修改后的函数代码如下:
CREATE FUNCTION [dbo].[func_ReportCriteria2] (@FromDate DateTime ,@ToDate DateTime ,@Item_List NVARCHAR(MAX) ) RETURNS nvarchar(max) AS BEGIN DECLARE @CRITERIA NVARCHAR(MAX) DECLARE @sqlCommand NVARCHAR(MAX) DECLARE @ItemResult NVARCHAR(MAX) SET @sqlCommand = '' IF(ISNULL(@Item_List,'') != '') BEGIN -- 先清洗字符串:移除所有单引号 SET @Item_List = REPLACE(@Item_List, '''', '') -- 拆分字符串后关联Item表,拼接带单引号的ItemCode SET @ItemResult = STUFF( (SELECT ',' + '''' + ItemCode + '''' FROM Item WHERE ItemGuid IN (SELECT value FROM STRING_SPLIT(@Item_List, ',')) FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') SET @sqlCommand = 'Item No: IN ('+ @ItemResult +') ' END SET @CRITERIA = 'From Date : ' + CONVERT(NVARCHAR(19),@FromDate,105) + ' to ' + CONVERT(NVARCHAR(19),@ToDate,105) + CHAR(13)+CHAR(10) + @sqlCommand RETURN @CRITERIA END
补充说明
- 代码中先通过
REPLACE移除了@Item_List中所有的单引号,再用STRING_SPLIT按逗号拆分为独立的GUID值列表,即可正常参与IN子句匹配。 - 拼接
ItemCode时主动添加了单引号,最终生成的IN子句格式符合预期。 - 添加了
TYPE).value('.', 'NVARCHAR(MAX)')处理特殊字符转义问题,避免拼接时出现XML转义字符异常。 - 如果你使用的SQL Server版本低于2016,没有内置
STRING_SPLIT函数,自行实现一个字符串拆分表值函数替换即可。
内容的提问来源于stack exchange,提问作者Esther123
相关产品推荐
相关产品推荐

