You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:27:00