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

如何将GUID列表作为参数传入SQL命令?

解决SQL中传入GUID列表过滤数据的问题

问题根源

你当前的写法存在两个核心问题:

  1. 直接将逗号分隔的GUID字符串作为单个参数传入时,SQL Server会把整个字符串视为一个完整的值,而非多个独立的GUID,因此IN子句只会匹配第一个符合的记录(或无匹配)。
  2. 手动给每个GUID加引号后,参数内容会变成带引号的字符串,SQL无法将其正确转换为uniqueidentifier类型,从而抛出转换异常。

解决方案

方法一:表值参数(推荐,性能最优、最规范)

这是处理批量参数的标准方式,适合大量GUID的场景:

  1. 先在SQL Server中创建表值类型:
CREATE TYPE GuidList AS TABLE (Id UNIQUEIDENTIFIER);
  1. C#代码中构造对应的数据表并传入:
// 将逗号分隔的字符串拆分为GUID数组
var guidArray = authorizedSoftwaresId.Split(',')
                                     .Select(Guid.Parse)
                                     .ToArray();

// 创建匹配表值类型的DataTable
DataTable guidTable = new DataTable();
guidTable.Columns.Add("Id", typeof(Guid));
foreach (var guid in guidArray)
{
    guidTable.Rows.Add(guid);
}

// 构造SQL语句
var command = @"select Software.Name as SoftwareName,SoftwareType.Name as SoftwareType 
                from AssetManagement.Asset as Software 
                inner join AssetManagement.AssetType as SoftwareType 
                    on SoftwareType.Id = Software.TypeId 
                where Software.Id in (select Id from @P)";

// 添加表值参数
cmd.Parameters.AddWithValue("@P", guidTable);
cmd.Parameters["@P"].SqlDbType = SqlDbType.Structured;
cmd.Parameters["@P"].TypeName = "GuidList"; // 对应SQL中创建的表值类型名称

方法二:动态添加独立参数

如果不想创建表值类型,可以为每个GUID单独生成参数:

var guidArray = authorizedSoftwaresId.Split(',')
                                     .Select(Guid.Parse)
                                     .ToArray();

// 生成参数占位符,如@P0, @P1, @P2...
var paramPlaceholders = string.Join(", ", guidArray.Select((_, idx) => $"@P{idx}"));

// 拼接SQL语句
var command = @"select Software.Name as SoftwareName,SoftwareType.Name as SoftwareType 
                from AssetManagement.Asset as Software 
                inner join AssetManagement.AssetType as SoftwareType 
                    on SoftwareType.Id = Software.TypeId 
                where Software.Id in ({0})";
command = string.Format(command, paramPlaceholders);

// 逐个添加参数
for (int i = 0; i < guidArray.Length; i++)
{
    cmd.Parameters.AddWithValue($"@P{i}", guidArray[i]);
}

方法三:STRING_SPLIT函数(SQL Server 2016+适用)

利用SQL Server自带的字符串拆分函数,适合小批量GUID场景:

var command = @"select Software.Name as SoftwareName,SoftwareType.Name as SoftwareType 
                from AssetManagement.Asset as Software 
                inner join AssetManagement.AssetType as SoftwareType 
                    on SoftwareType.Id = Software.TypeId 
                inner join STRING_SPLIT(@P, ',') as SplitIds
                    on Software.Id = CAST(SplitIds.value AS UNIQUEIDENTIFIER)";

cmd.Parameters.AddWithValue("@P", authorizedSoftwaresId);

注意:需确保authorizedSoftwaresId中的每个值都是有效的GUID格式,否则CAST转换会失败。


内容的提问来源于stack exchange,提问作者A.HADDAD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:25:25