sql-server - 使用 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 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+ 服务下运行的分布式组件。
推荐阅读
- go - 为什么goroutine会暂停几分钟
- xamarin - 是否可以在 Xamarin.Forms 上用“两根手指”检测左滑动多点触控,尤其是在 UWP 上?[iOS、安卓、UWP]
- android - 我们可以在 Android Network Profiler 面板中格式化 JSON 响应吗?
- sql - 如果数据库中已经存在,则从 Temp 表中删除数据
- django - 如何使用来自另一个数据库(不是默认数据库)的 auth_user?
- javascript - 烧瓶现场;为不同的元素重用 Javascript/Ajax 函数(MacOS Mojave)
- node.js - Telegram Webhook 在群聊中未触发
- node.js - 如何从 Azure 云中的 nodejs 应用程序发送 gmail?
- angular - Angular 6中泳道图表中的日期格式问题
- apache-spark - 如何在使用 Spark 2.1 部署的 YARN 集群上使用不同的 Spark 版本(Spark 2.4)?