Я подозреваю, что это не SQL Server или даже соединение, вставляющее данные. Интересно, является ли это повреждением данных при установке значения параметра команды или даже внутри приложения. Я экспериментировал с тайм-аутами соединений и команд, чтобы побудить их при вставке, и ваше предположение о том, что он откатит отмененную неявную транзакцию, верен. Вот пример:
// Use connection with timeout of 1 second to generate a timeout when inserting
using (var conn = new SqlConnection(@"Data Source=(localdb)\mssqllocaldb;Integrated Security=SSPI;Initial Catalog=tempdb;Connection Timeout=1"))
using (var cmd = conn.CreateCommand())
{
cmd.CommandTimeout = 1;
conn.Open();
cmd.CommandText = @"if not exists(select * from sys.tables where name = 'LongStringTruncation')
begin
create table LongStringTruncation (Data nvarchar(max));
end";
cmd.ExecuteNonQuery();
cmd.CommandText = "insert LongStringTruncation values (@t)";
var t = cmd.CreateParameter();
t.DbType = DbType.String;
t.ParameterName = "@t";
t.Value = new String('A', 30000000); // 30,000,000 chars = 60MB
cmd.Parameters.Add(t);
cmd.ExecuteNonQuery();
}
Когда это завершается успешно (то есть запрос завершается до истечения таймаута); следующий запрос показывает, что все 30 000 000 символов были переданы и вставлены; когда он терпит неудачу с таймаутом, таблица пуста.
select len(Data) from LongStringTruncation;
Обратите внимание, что я использовал SQL 2014 здесь, так что это может быть есть ошибка в SQL 2008 R2, которые могли бы раскрыть этот тест. Мой тест также использует параметры, и если вы вместо этого используете конкатенацию строк для создания своего SQL, это может быть еще одним источником проблем.
Если ни один из них не объясняет проблему, то единственный вывод, который имеет смысл, заключается в том, что само приложение каким-то образом обрезает данные, прежде чем вставлять их. Учитывая случайный характер, я бы подумал, что мои первые подозреваемые будут воспринимать то, как вы получите строковые данные (например, буферизованный поток без покраски перед чтением результата), или какой-то многопоточный ранг при получении значения/сигнализации, что он будет завершен.
Возможно, вам необходимо сохранить это как текст, а не nvarchar (max). В зависимости от того, какие другие данные у вас есть в этой строке, вы можете столкнуться с общей шириной строки. Взгляните на https://technet.microsoft.com/en-us/library/ms186981%28v=sql.105%29.aspx – LordBaconPants
@LordBaconPants типы данных text и ntext устарели и не будут использоваться для новых реализаций. MS четко заявляет, что вы shoud используете varchar (max) и nvarchar (max) – Blim
Зачем вам хранить 30 МБ строковых данных в одном столбце db?Похоже, у вас проблема моделирования здесь в базе данных. Кроме того, мне кажется, что ваша проблема с усечением все еще может быть в вашем приложении. Если вы используете веб-службы, вероятно, есть ограничение на отправку и получение, например, например, в случае службы WCF: http://stackoverflow.com/questions/884235/wcf-how-to-increase-message -size-quota – maplemale