首页 > 解决方案 > 使用 OPENROWSET 调用 T-SQL 过程

问题描述

我有两个疑问。

第一个查询.csv在文件C:\...夹中创建一个没有错误的文件:

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=C:\Temp\TEMP_SQL_FOLDER\T-SQL to csv\;HDR=YES;FMT=Delimited','SELECT * FROM [test3.csv]') 
    SELECT Id, PatientNumber, Title_Id, FirstName, LastName, Gender_Id 
    FROM PPM2..Activity_Patient ap

第二个查询应该做同样的事情,除了SELECT语句被过程调用替换:

INSERT INTO OPENROWSET('Microsoft.ACE.OLEDB.12.0','Text;Database=C:\Temp\TEMP_SQL_FOLDER\T-SQL to csv\;HDR=YES;FMT=Delimited','SELECT * FROM [test3.csv]') 
    EXEC dbo.PPMLoad_MediRecOSRServices @FinancialYear='2020'

第二条语句不起作用并引发此错误:

消息 7390,级别 16,状态 2,第 10 行
由于链接服务器“(null)”的 OLE DB 提供程序“Microsoft.ACE.OLEDB.12.0”不支持所需的事务接口,因此无法执行请求的操作。

我启用了必要的设置:

USE [master]
GO 

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1 
GO 

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1 
GO

第二个查询根本不运行。我也没有使用任何链接服务器。这只是一个简单的导出到本地 C: 驱动器。

有任何想法吗?

标签: sql-servertsqlexport-to-csvopenrowset

解决方案


错误消息的含义是 SQL Server 正在尝试启动 Access 驱动程序不支持的分布式事务。

您可以尝试允许驱动程序的非事务更新:

EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'NonTransactedUpdates', 1

在 dba.stackexchange 上的答案中发现了这一点——它还重复了 ACE 驱动程序文档中的以下警告,在这种情况下您可能应该提防:

Access 数据库引擎 2016 Redistributable 不适用于:. . . 供系统服务或服务器端程序使用,其中代码将在系统帐户下运行,或将同时处理多个用户身份,或高度可重入并期望无状态行为。示例包括在没有用户登录时从任务调度程序运行的程序,或从服务器端 Web 应用程序(如 ASP.NET)调用的程序,或在 COM+ 服务下运行的分布式组件。


推荐阅读