考虑我正在针对远程服务器执行的下面的设想示例。命令本身不返回任何数据但是当我在Process Explorer中观察进程时,我可以看到我通过网络接收大量数据 - 下面的示例我收到了~370 MB。在数据库服务器上查看Process Explorer我可以看到一个网络活动图,它与我的客户端计算机上的网络活动图完全匹配,但是这个图用于发送数据。
造成这种情况的原因是什么?如何预防?
var query = @"
declare @Value nvarchar(max), @index int
set @index = 0
while @index < 10000000
begin
set @Value = 'this is just a test'
set @index = @index + 1
end";
var connectionString = "MyConnectionString";
using (var connection = new SqlConnection(connectionString))
using (var command = connection.CreateCommand())
{
connection.Open();
command.CommandTimeout = 0;
command.CommandText = query;
command.ExecuteNonQuery();
}
答案 0 :(得分:4)
对于批处理中的每个SQL语句,SQL以DONE token响应。每个令牌都是13个字节。
循环的每次迭代表示3个语句(2个set语句和循环条件结构本身)。 3 * 13字节* 10,000,000 = 390 MB。
您可以使用SET NOCOUNT ON
(谢谢,Scott)来避免这种情况。