我正在尝试将
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
在数据库上运行了相同的查询,无论字母大小写,我都会得到相同的结果。所以我的代码中有些东西我无法确定导致问题的原因。
感谢任何意见。谢谢你。
一种可能的方法是将这些 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似乎是一种可行的选择。