BitConverter.ToString(byte[]) 可以从 SQL SMO 查询中处理的最大长度是多少?

What is the max length that BitConverter.ToString(byte[]) can handle from a SQL SMO query?

我正在将数据从 SQL Server 2012 table 提取到 SQL SMO table 中,然后遍历结果集。当执行以下命令时,我在运行时收到内存不足错误:

let data = dr["Data"] == DBNull.Value ? "NULL" : "convert(varbinary(max), '0x" + BitConverter.ToString((byte[])dr["Data"]).Replace("-", "") + "')"

直到遇到 DATALENGTH([Data]) 约为 15MB(15127052 字节)的行时才会抛出错误。

是否存在 BitConverter.ToString(byte[]) 可以处理的最大二进制数据大小?

它实际上与 SMO 和数据库完全无关,一切都与 string.Replace() 功能的明显限制有关。我破解了LINQ代码,这样一步步操作数据,发现当我尝试执行s.Replace("-", "")时,就是会报错的地方。在 Stack Exchange 上稍微研究了一下后,我发现:Does string.Replace(string, string) create additional strings? 应用我在那里找到的内容,我将代码从使用字符串更改为使用 StringBuilder,然后使用 StringBuilder.Replace(string, string) 函数并且它起作用了。显然,因为 string.Replace(string, string) 创建了源字符串的副本,所以一定存在某种内存限制,但由于 StringBuilder 对原始字符串而不是副本进行操作,因此该限制不适用。

最后代码看起来像这样:

StringBuilder sb = new StringBuilder(dr["Data"] == DBNull.Value ? "NULL" : BitConverter.ToString((byte[])dr["Data"]));

sb.Replace("-", "");

感谢您对此的帮助。