添加 GUID 列表作为 SqlParameters 进行过滤以执行 IN 运算符

问题描述 投票:0回答:1

我正在尝试将

GUIDs
列表作为
SqlParameters
传递,以使用
IN
运算符执行查询。但即使提供的一些 GUID 与表中存在的一样有效,结果也是空的。

这是我写的一个例子

string query = "SELECT * FROM tblStudents WHERE studentID IN (";

List<SqlParameter> parameters = new List<SqlParameter>();
for (int i = 0; i < lstGuids.Count; i++)
{
    string paramName = "@guid" + i;
    query += paramName + ",";
    parameters.Add(new SqlParameter(paramName, SqlDbType.UniqueIdentifier) { Value = new Guid(lstGuids[i].Trim()) });
}

query = query.TrimEnd(',') + ")";

我使用

SSMS
在数据库上尝试了相同的设置,它有效。

在进一步审查时,我注意到,

GUIDs
从代码添加到参数时是小写的。为了验证,我使用
SSMS
在数据库上运行了相同的查询,无论字母大小写,我都会得到相同的结果。所以我的代码中有些东西我无法确定导致问题的原因。

感谢任何意见。谢谢你。

c# ado.net azure-sql-database guid
1个回答
0
投票

一种可能的方法是将这些 GUID 打包成一个字符串,用例如分隔符分隔。分号

;
,然后在查询中使用
STRING_SPLIT
函数将该 GUID 字符串转换为 GUID 列表 - 类似于:

string query = "SELECT * FROM tblStudents " + 
               "WHERE studentID IN (SELECT Value FROM STRING_SPLIT(@StudentIdParam, ';'))";

SqlParameter parameters = new SqlParameter>("@StudentIdParam", SqlDbType.VarChar, 1000);
parameters.Value = "guid1;guid2;guid3"; // replace with your GUIDs here

如果您要使用存储过程,那么我建议使用表值参数类型 - 但对于“临时”查询,该选项不可用,因此从“GUID 连接字符串”中提取 GUID似乎是一种可行的选择。

© www.soinside.com 2019 - 2024. All rights reserved.