SqlBulkCopy 截断 VARCHAR(MAX) 列中的字符串
SqlBulkCopy truncating string in VARCHAR(MAX) column
我在 SQL Server 2016 上有一个简单的 table:
CREATE TABLE AgentDownload
(
Download VARCHAR(max)
)
我使用下面的代码通过 C# 中的 SqlBulkCopy class 填充此 table。
var agentDataTable = new DataTable();
agentDataTable.Clear();
agentDataTable.Columns.Add("Download");
var agentDownloadRow = agentDataTable.NewRow();
var veryLongString = "aaa..." // 200,000 a's repeated
agentDownloadRow["Download"] = veryLongString;
agentDataTable.Rows.Add(agentDownloadRow);
using (var connection = new SqlConnection("Data Source=Server;Initial Catalog=Database;Integrated Security=True;"))
{
connection.Open();
var transaction = connection.BeginTransaction();
using (var sbCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.CheckConstraints, transaction))
{
sbCopy.BulkCopyTimeout = 0;
sbCopy.BatchSize = 10000;
sbCopy.DestinationTableName = "AgentDownload";
sbCopy.WriteToServer(agentDataTable);
}
transaction.Commit();
}
当我检索此条目时,在数据库中,单元格值被截断为 65,535 个字符。这是某种限制,但我不确定这是从哪里来的,或者是否有任何解决办法?该列可以包含更多的字符,C# 中的字符串类型也可以包含更多的字符。有没有做这个操作的?
我认为这可能是 SqlBulkCopy 的限制 class 但使用如下替代代码也会产生相同的结果:
using (var connection = new SqlConnection("Data Source=Server;Initial Catalog=Database;Integrated Security=True;"))
{
connection.Open();
var transaction = connection.BeginTransaction();
var cmd = connection.CreateCommand();
cmd.Transaction = transaction;
cmd.CommandText = "insert into AgentDownload (Download) values (CAST('' AS VARCHAR(MAX)) + @testVariable)";
var parameter = new SqlParameter
{
ParameterName = "testVariable",
DbType = DbType.String,
Size = -1,
Value = veryLongString
};
cmd.Parameters.Add(parameter);
cmd.ExecuteNonQuery();
transaction.Commit();
}
您似乎正在使用 SSMS 查看批量插入的数据。 SSMS 默认将大值截断为 65535 个字符。
要在结果网格中查看当前查询 window 的完整值,请从 Query-->Query Options-->Results-->Grid
下的 SSMS 菜单更改“检索到的最大字符数”值。
也可以为 Tools-->Options-->Query Results-->SQL Server-->Results to Grid
下的所有新查询 windows 指定值。但是,请考虑包含大值的许多行对客户端内存要求的影响。我建议明智地更改全局选项。
我在 SQL Server 2016 上有一个简单的 table:
CREATE TABLE AgentDownload
(
Download VARCHAR(max)
)
我使用下面的代码通过 C# 中的 SqlBulkCopy class 填充此 table。
var agentDataTable = new DataTable();
agentDataTable.Clear();
agentDataTable.Columns.Add("Download");
var agentDownloadRow = agentDataTable.NewRow();
var veryLongString = "aaa..." // 200,000 a's repeated
agentDownloadRow["Download"] = veryLongString;
agentDataTable.Rows.Add(agentDownloadRow);
using (var connection = new SqlConnection("Data Source=Server;Initial Catalog=Database;Integrated Security=True;"))
{
connection.Open();
var transaction = connection.BeginTransaction();
using (var sbCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.CheckConstraints, transaction))
{
sbCopy.BulkCopyTimeout = 0;
sbCopy.BatchSize = 10000;
sbCopy.DestinationTableName = "AgentDownload";
sbCopy.WriteToServer(agentDataTable);
}
transaction.Commit();
}
当我检索此条目时,在数据库中,单元格值被截断为 65,535 个字符。这是某种限制,但我不确定这是从哪里来的,或者是否有任何解决办法?该列可以包含更多的字符,C# 中的字符串类型也可以包含更多的字符。有没有做这个操作的?
我认为这可能是 SqlBulkCopy 的限制 class 但使用如下替代代码也会产生相同的结果:
using (var connection = new SqlConnection("Data Source=Server;Initial Catalog=Database;Integrated Security=True;"))
{
connection.Open();
var transaction = connection.BeginTransaction();
var cmd = connection.CreateCommand();
cmd.Transaction = transaction;
cmd.CommandText = "insert into AgentDownload (Download) values (CAST('' AS VARCHAR(MAX)) + @testVariable)";
var parameter = new SqlParameter
{
ParameterName = "testVariable",
DbType = DbType.String,
Size = -1,
Value = veryLongString
};
cmd.Parameters.Add(parameter);
cmd.ExecuteNonQuery();
transaction.Commit();
}
您似乎正在使用 SSMS 查看批量插入的数据。 SSMS 默认将大值截断为 65535 个字符。
要在结果网格中查看当前查询 window 的完整值,请从 Query-->Query Options-->Results-->Grid
下的 SSMS 菜单更改“检索到的最大字符数”值。
也可以为 Tools-->Options-->Query Results-->SQL Server-->Results to Grid
下的所有新查询 windows 指定值。但是,请考虑包含大值的许多行对客户端内存要求的影响。我建议明智地更改全局选项。