在存储过程中维护链接服务器上的事务,该存储过程使用 OpenRowSet 命令从 Excel 文件读取数据

发布于 2024-08-16 17:30:24 字数 1239 浏览 4 评论 0原文

我有一个位于 32 位 sql 服务器上的 Helper DB,并且添加了一个 64 位链接服务器,

以执行 Excel 导入操作,因为 64 位 sql 服务器计算机不支持 Jet.oledb 驱动程序。

一切工作正常,但我必须维护链接服务器数据库上发生的插入、更新、删除事务,

我已在客户端计算机和服务器计算机上配置了 DTC 服务,

在 sp 顶部添加了块,用于存储过程启动时的事务,例如,

开始尝试在开始事务时设置 XACT_ABORT
BEGIN TRY

SET XACT_ABORT ON

BEGIN TRANSACTION

--Code

--Code

END TRY

BEGIN CATCH

IF @@TRANCOUNT<>0 ROLLBACK TRANSACTION

--// 引发错误以登录网站。

声明 @ErrorMessage NVARCHAR(4000);

声明@ErrorSeverity INT;

声明@ErrorState INT;

选择

@ErrorMessage = ERROR_MESSAGE(),

@ErrorSeverity = ERROR_SEVERITY(),

@ErrorState = ERROR_STATE();

RAISERROR (@ErrorMessage, -- 消息文本。

   @ErrorSeverity, -- Severity.  

   @ErrorState -- State.  

   );  

但它会抛出一个错误,指出

无法执行请求的操作,因为链接服务器“(null)”的 OLE DB 提供程序“Microsoft.Jet.OLEDB.4.0”不支持所需的操作事务接口。

我用来从 Excel 工作表读取数据的 Openrowset 函数抛出错误

,即

SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 5.0;HDR=是; IMEX=1;数据库=C:\test.xls','从 [Sheet$] 中选择 EmployeeID
其中 EmployeeID 不为空')

我真的陷入困境并变得疯狂,因为我无法找到任何解决方案,

提前感谢您的帮助,

I have a Helper DB which is on 32bit sql server and i have added a linked server of 64bit,

to perform Excel Import operation as Jet.oledb driver is not supported on 64-bit sql server machine.

Everything is working fine, but i have to maintain transactions for insert ,update,delete that happens on linked server database,

I have configured DTC service on client machine and server machine,

Added Block on top of sp for transaction on stored procedure start like,

BEGIN TRY SET XACT_ABORT ON BEGIN TRANSACTION
BEGIN TRY

SET XACT_ABORT ON

BEGIN TRANSACTION

--Code

--Code

END TRY

BEGIN CATCH

IF @@TRANCOUNT<>0 ROLLBACK TRANSACTION

--// raise error to log in website.

DECLARE @ErrorMessage NVARCHAR(4000);

DECLARE @ErrorSeverity INT;

DECLARE @ErrorState INT;

SELECT

@ErrorMessage = ERROR_MESSAGE(),

@ErrorSeverity = ERROR_SEVERITY(),

@ErrorState = ERROR_STATE();

RAISERROR (@ErrorMessage, -- Message text.

   @ErrorSeverity, -- Severity.  

   @ErrorState -- State.  

   );  

But it throws an err saying,

The requested operation could not be performed because OLE DB provider "Microsoft.Jet.OLEDB.4.0" for linked server "(null)" does not support the required transaction interface.

It is throwing error on Openrowset function that i have used to read data from Excel sheet

i.e,

SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
'Excel 5.0;HDR=Yes; IMEX=1;Database=C:\test.xls','SELECT EmployeeID FROM [Sheet$]
where EmployeeID is not null')

I m really stuck and getting Crazy as am not able to find any solution,

Thanks in Advance for Help,

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

当梦初醒 2024-08-23 17:30:24

我有一个类似的问题,从 CSV 导入。通过命名我的事务(例如 BEGIN TRAN mytran)并检查 @@ROWCOUNT 而不是 @@TRANCOUNT 来解决这个问题。

我知道自从OP问起以来已经很长时间了,但也许它可以帮助有人谷歌搜索这个问题。 :)

I had a similar problem, importing from CSV. Solved it by naming my transaction (e.g. BEGIN TRAN mytran) and checking @@ROWCOUNT instead of @@TRANCOUNT.

I understand it's a long time since OP asked, but maybe it could help somebody googling for this issue. :)

不必在意 2024-08-23 17:30:24

如果您在光标中但在开始转换之前打开 Excel 文件会怎样? ?

What if you open the Excel file in a cursor, but before the Begin Trans. ?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文