SQL Server:将数据从一个表传输到另一个 [内存分配失败]

Posted

技术标签:

【中文标题】SQL Server:将数据从一个表传输到另一个 [内存分配失败]【英文标题】:SQL Server: Transfer data from one table to another [Memory Allocation Failure] 【发布时间】:2014-03-06 13:43:24 【问题描述】:

所以我有以下查询将数据从 DB1 中的一个表传输到 DB2 中的另一个表。

DB1 表:tblSupportAttachments

DB2 表:tblSupportAttachments

/* tblSupportAttachments */
SET @Sql = N'
INSERT INTO tblSupportAttachments
        ( fldName ,
          fldExtension ,
          fldFile ,
          fldCreatedBy ,
          fldCreatedDate ,
          fldSupportId
        )
SELECT fldName ,
          fldExtension ,
          fldFile ,
          fldCreatedBy ,
          fldCreatedDate ,
          fldSupportId 
FROM ' + @SourceDB + '.tblSupportAttachments';
EXECUTE sp_executesql @Sql;

fldFile: 是 varbinary(MAX) 类型

此表基本上保存有关特定文件的数据,该文件直接上传到数据库中的 fldFile 字段,它可以是 pdf、zip 文件或其他文件

当我尝试将此数据传输到另一个数据库中的另一个表时,我收到以下错误:

链接服务器“10.0.88.99”的 OLE DB 提供程序“SQLNCLI11”返回消息“内存分配失败”。 消息 7330,第 16 层,状态 2,第 2 行 无法从链接服务器“10.0.88.99”的 OLE DB 提供程序“SQLNCLI11”获取行。

有人知道为什么会这样吗?

当我使用生成脚本功能时,我收到以下错误:

Microsoft.SqlServer.Management.SqlScriptPublish.SqlScriptPublishException: 编写对象脚本时出错。 ---> System.InvalidOperationException:内部连接致命错误。在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler、SqlDataReader 数据流、 BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean & dataReady) 在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler、SqlDataReader 数据流、 BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 在 System.Data.SqlClient.TdsParser.ProcessAttention(TdsParserStateObject stateObj) 在 System.Data.SqlClient.TdsParserStateObject.ResetCancelAndProcessAttention() 在 System.Data.SqlClient.TdsParserStateObject.CloseSession() 在 System.Data.SqlClient.SqlDataReader.TryCloseInternal(布尔 closeReader) 在 System.Data.SqlClient.SqlDataReader.Close() 在 Microsoft.SqlServer.Management.Smo.DataEnumerator.CleanUp() 在 Microsoft.SqlServer.Management.Smo.DataEnumerator.Dispose() 在 Microsoft.SqlServer.Management.Smo.SingleFileWriter.ScriptData(IEnumerable1 dataScript, Urn table) at Microsoft.SqlServer.Management.Smo.ScriptMaker.ScriptDataToWriter(IEnumerable1 数据脚本,瓮瓮)在 Microsoft.SqlServer.Management.Smo.ScriptMaker.ScriptCreateSpecialUrn(Urn 瓮,ScriptingPreferences sp,ObjectScriptingType& scriptType)在 Microsoft.SqlServer.Management.Smo.ScriptMaker.ScriptCreate(瓮瓮, ScriptingPreferences sp、ObjectScriptingType& scriptType) 在 Microsoft.SqlServer.Management.Smo.ScriptMaker.ScriptCreateObjects(IEnumerable1 urns) at Microsoft.SqlServer.Management.Smo.ScriptMaker.ScriptUrns(List1 有序Urns)在 Microsoft.SqlServer.Management.Smo.ScriptMaker.DiscoverOrderScript(IEnumerable1 urns) at Microsoft.SqlServer.Management.Smo.ScriptMaker.ScriptWorker(List1 瓮,ISmoS​​criptWriter 作家)在 Microsoft.SqlServer.Management.Smo.ScriptMaker.Script(Urn[] urns, ISmoS​​criptWriter 作家)在 Microsoft.SqlServer.Management.SqlScriptPublish.SqlScriptGenerator.DoScript(ScriptOutputOptions outputOptions) --- 内部异常堆栈跟踪结束 --- at Microsoft.SqlServer.Management.SqlScriptPublish.GeneratePublishPage.worker_DoWork(对象 发件人,DoWorkEventArgs e) 在 System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e) 在 System.ComponentModel.BackgroundWorker.WorkerThreadStart(对象 论据)

【问题讨论】:

【参考方案1】:

你能分享一下吗?您尝试传输的行数以及用于源和目标服务器上的链接服务器的日志访问级别。

请通过将系统管理员提供给目标和源用户来进行检查。 您也可以尝试使用 OpenRowset 或导入 exprt 向导。

【讨论】:

我正在尝试将 5450 行从 SourceDB(位于链接服务器中)传输到执行此插入查询的目标数据库。目标和源的访问级别均为 sysadmin。【参考方案2】:

您也可以尝试打开行集或导出导入向导。让我们不要犯错误。

还请分享sql server version、server memory和max server memory

【讨论】:

我使用的是SQL Server 2012,服务器内存为2GB,最大服务器内存为1GB,包括使用Export Script方法时产生的错误。【参考方案3】:

您的错误: " 编写对象脚本时出错。---> System.InvalidOperationException: 内部连接致命错误" AND "内存分配错误"

从您的错误来看,它似乎是一个明显的内存问题,但我仍然不确定,因为这个错误是相当新的。

对于 sql 2012 的内存建议如下,您已经是@ minimum。

最低: 速成版:512 MB 所有其他版本:1 GB

推荐: 速成版:1 GB 所有其他版本:至少 4 GB,应随着数据库大小的增加而增加以确保最佳性能。

您可以尝试使用相同的查询再进行一项测试,但减少否。使用 where 子句传输的行数。

此测试将确认是否由于数据内存量无法处理或链接服务器和内存。

请告诉我你得到了什么

【讨论】:

如果我使用 Sql Server Management Studio 的导出数据功能一切正常,当我使用之前包含的 INSERT 语句时就会出现问题。

以上是关于SQL Server:将数据从一个表传输到另一个 [内存分配失败]的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008 查询将表数据从一个移动到另一个

sql server如何如何从一个表中提取部分资讯插入到另一表中

根据唯一记录 postgres 将一列从一个 sql 表传输到另一列

SQL Server 2005 如何将一个数据库中的几张表,引入到另一个数据库中。

SQL Server - 将存储过程从一个数据库复制到另一个数据库

SQL Query 根据过滤器将数据传输到另一个表