2010-02-12 102 views
0

我在运行此查询的问题:问题在SQL Server中运行对链接服务器DELETE语句2008

DELETE FROM [IRPROD]..[BUDGET_USER].[GL_EXP] 
WHERE FISCAL_YEAR = 2010 

IRPROD是链接服务器到Oracle 10g数据库。它使用Oracle OleDB提供程序进行链接。有~79000条记录需要删除。运行这个查询它删除54.再次运行它给了我这个错误信息。

Msg 7399, Level 16, State 1, Line 1 
The OLE DB provider "OraOLEDB.Oracle" for linked server "IRPROD" reported an error. The provider reported an unexpected catastrophic failure. 
Msg 7330, Level 16, State 2, Line 1 
Cannot fetch a row from OLE DB provider "OraOLEDB.Oracle" for linked server "IRPROD". 

很明显,“灾难性失败”是不好的。但奇怪的是,我可以运行SELECT和INSERT语句整天,它工作正常。我有权删除行。另外,如果我通过Access链接表,我可以删除记录。

任何想法?

+0

有助于诊断的建议:尝试在where子句中添加一个条件,例如WHERE FISCAL_YEAR = 2010 AND some_other_column mjv 2010-02-12 16:02:50

+0

好主意。我跑了另一个查询,它会删除8行,但它回来并说“0行受到影响”。有趣的是,它需要花费相同的时间才能返回结果(1:15)。现在这个表上没有索引或键。这可能会影响它吗? – 2010-02-12 16:11:25

+0

@Clint这确实是奇怪的(0行受影响,而不是8)。我假设你检查了8行有效_not_删除。在正常/期望的查询的持续持续时间上:没有索引时,要删除的行的选择意味着对各种排序的表扫描,如果表是可用的,则需要相当长的时间并且会花费更多或更少的时间相同数量(仅因某些缓存等而有所不同)。我假设用于检查行,诊断等的选择查询与一个显示相同,但​​是将'DELETE'替换为'SELECT *' – mjv 2010-02-12 16:44:28

回答

0

好的,事实证明这是一个简单的解决方案,并带有复杂的解释。

第一个问题是过时的Oracle驱动程序。我们使用的是第9版的提供商,所以我更新到了通过我们的OIT商店提供的10g提供商。结果发现他们有一个错误。所以我卸载了它并安装了Oracle更新的10g提供程序以修复该错误。

其次,我将'fiscal_year'字段从varchar2类型更改为数字类型。如果您发送DELETE语句时使用了与测试字段进行比较的WHERE(或者可能是任何条件子句,我只检查了WHERE),那么SQL Server必须对该表执行远程扫描,该表基本上检索数据,逐一删除每一行。如果您发送的DELETE语句的数字为WHERE,那么SQL Server可以直接将查询传递到远程数据库,而无需进行远程扫描。

我希望这有助于某人。我通过试验和错误以及互联网上的点点滴滴发现了这一点。感谢所有帮助解决这个问题的人。

1

这是OleDB提供程序和数据库错误5043675: 设置链接服务器可以正常读取数据,但更新或删除数据会失败并显示错误。

,使用补丁程序5043675,6637236

可以从Oracle技术支持下载。

+0

我提高了你的答案,因为这是问题的一部分。此外,在答案中提供链接也很有帮助,它使最终读者更容易。 – 2010-02-15 16:41:13

相关问题