C# 啊,数十万。查询的大小没有限制吗?我不确定,但是我可以发送的查询的大小没有限制吗?id是guid,最终每个guid有36个字节。如果我有20000个ID,那么这是一个超过72000字节长的查询。这可能会增长到数十万。查询的大小没有限制吗?这种方法非常有效。
C# 啊,数十万。查询的大小没有限制吗?我不确定,但是我可以发送的查询的大小没有限制吗?id是guid,最终每个guid有36个字节。如果我有20000个ID,那么这是一个超过72000字节长的查询。这可能会增长到数十万。查询的大小没有限制吗?这种方法非常有效。,c#,sql-server,C#,Sql Server,啊,数十万。查询的大小没有限制吗?我不确定,但是我可以发送的查询的大小没有限制吗?id是guid,最终每个guid有36个字节。如果我有20000个ID,那么这是一个超过72000字节长的查询。这可能会增长到数十万。查询的大小没有限制吗?这种方法非常有效。在使用大量ID时性能也很好(与IN子句不同),这看起来很棒。我正在尝试运行它,但我得到一个异常,它需要显式类型。设置idParam.SqlDbType=SqlDbType.Structured似乎可以解决这个问题。听起来对吗?这导致了一个例外,
啊,数十万。查询的大小没有限制吗?我不确定,但是我可以发送的查询的大小没有限制吗?id是guid,最终每个guid有36个字节。如果我有20000个ID,那么这是一个超过72000字节长的查询。这可能会增长到数十万。查询的大小没有限制吗?这种方法非常有效。在使用大量ID时性能也很好(与IN子句不同),这看起来很棒。我正在尝试运行它,但我得到一个异常,它需要显式类型。设置idParam.SqlDbType=SqlDbType.Structured似乎可以解决这个问题。听起来对吗?这导致了一个例外,即可变长度参数需要一个大小。我不确定是将其设置为Guid的大小还是项目数乘以Guid的大小,但当我将其设置为一个相当大的数字时,这似乎很好。最后,“all”是一个关键字,所以我在查询中将其更改为有效标识符,效果非常好。这是一个很好的解决方案。谢谢。@cabird,关于
SqlDbType=SqlDbType.Structured
你说得对。关于长度:你不需要再使用命令。准备,正如我在更新的回答中提到的,这个方法非常有效。在使用大量ID时性能也很好(与IN子句不同),这看起来很棒。我正在尝试运行它,但我得到一个异常,它需要显式类型。设置idParam.SqlDbType=SqlDbType.Structured似乎可以解决这个问题。听起来对吗?这导致了一个例外,即可变长度参数需要一个大小。我不确定是将其设置为Guid的大小还是项目数乘以Guid的大小,但当我将其设置为一个相当大的数字时,这似乎很好。最后,“all”是一个关键字,所以我在查询中将其更改为有效标识符,效果非常好。这是一个很好的解决方案。谢谢。@cabird,关于SqlDbType=SqlDbType.Structured
你说得对。那么关于长度:你不需要使用命令。正如我在更新的答案中提到的那样,再准备
private static Dictionary<Guid, string> foo(IEnumerable<Guid> guids, SqlConnection conn)
{
using (SqlCommand command = new SqlCommand(null, conn))
{
command.CommandText = "select document from Documents where id = @id";
SqlParameter idParam = new SqlParameter("@id", SqlDbType.UniqueIdentifier);
command.Parameters.Add(idParam);
command.Prepare();
var documents = new Dictionary<Guid, string>();
foreach (var guid in guids)
{
idParam.Value = guid;
object obj = command.ExecuteScalar();
if (obj != null)
{
documents[guid] = (string)obj;
}
}
return documents;
}
}
CREATE TYPE IdTableType AS TABLE
(
Id uniqueidentifier
);
private static Dictionary<Guid, string> foo(IEnumerable<Guid> guids, SqlConnection conn)
{
using (SqlCommand command = new SqlCommand(null, conn))
{
// use parameter as normal table in the query
command.CommandText =
"select document from Documents d inner join @AllIds a ON d.id = a.Id";
// DataTable is used for Table-Valued parameter as value
DataTable allIds = new DataTable();
allIds.Columns.Add("Id"); // Name of column need to be same as in created Type
foreach(var id in guids)
allids.Rows.Add(id);
SqlParameter idParam = new SqlParameter
{
ParameterName = "@AllIds",
SqlDbType=SqlDbType.Structured // Important for table-valued parameters
TypeName = "IdTableType", // Important! Name of the type must be provided
Value = allIds
};
command.Parameters.Add(idParam);
var documents = new Dictionary<Guid, string>();
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
documents[guid] = reader[0].ToString();
}
}
return documents;
}
}
connection.Query("select document from Documents where id in @ids", new { ids = guids});