HCRM博客

为什么使用 OpenRowset 时会出现报错?

在使用 SQL Server 的 OPENROWSET 函数时,可能会遇到各种报错,这些错误可能由多种原因引起,包括配置问题、权限问题、数据源问题等,本文将详细探讨这些问题并提供解决方案。

常见 OPENROWSET 报错型及解决方法

为什么使用 OpenRowset 时会出现报错?-图1
(图片来源网络,侵权删除)

1、数据库未启用 Ad Hoc Distributed Queries

错误信息:SQL Server blocked access to STATEMENT 'OpenRowset/OpenDatasource' component 'Ad Hoc Distributed Queries' because this component is turned off as part of the security configuration for this server。

解决方法

     EXEC sp_configure 'show advanced options', 1;  
     RECONFIGURE;  
     EXEC sp_configure 'Ad Hoc Distributed Queries', 1;  
     RECONFIGURE;

2、OLE DB 提供程序错误

错误信息:The OLE DB provider "OraOLEDB.Oracle" for linked server "(null)" reported an error. Access denied。

解决方法

确保在 SSMS 中为链接服务器勾选了“Allow inprocess”选项,并重启 SSMS。

3、TNS 配置文件问题

错误信息:ORA12154: TNS: 无法解析指定的连接标识符。

解决方法

确保在 TNS 配置文件中正确配置了 ORACLE 实例信息。

SQL Server 是 64 位,确保配置了 64 位的 TNS。

4、普通账号访问被拒绝

错误信息:Ad hoc access to OLE DB provider 'OraOLEDB.Oracle' has been denied。

解决方法

在注册表中设置 DisallowAdHocAccess 属性为 1:

       HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.MSSQLSERVER\Providers\OraOLEDB.Oracle\DisallowAdHocAccess

5、登录超时或网络问题

错误信息:登录超时已过期,与 SQL Server 建立连接时发生了与网络相关的或特定于实例的错误。

解决方法

确保实例名称正确,SQL Server 配置为允许远程连接。

检查网络连接是否正常。

6、工作组信息文件丢失或被独占打开

错误信息:无法启动应用程序,工作组信息文件丢失,或是已被其它用户以独占方式打开。

解决方法

确保 Access 数据库文件未被其他用户独占打开,并且工作组信息文件存在。

7、触发器中使用 OPENROWSET 报错

错误信息:提供程序报告了意外的灾难性错误。

解决方法

确保 FROM 子句是一个单一的简单表名。

使用 TRY...CATCH 结构捕获并处理错误。

示例代码

以下是一些常见的 OPENROWSET 使用示例和错误处理代码:

示例 1:从 Excel 文件中读取数据

SELECT *
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
                'Excel 8.0;Database=C:\Finance\account.xls',
                'SELECT * FROM [Sheet1$]')

示例 2:从 Access 数据库中读取数据

SELECT *
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
                'D:\aa.mdb';'admin';'12345',
                'SELECT * FROM TableName')

示例 3:在触发器中使用 OPENROWSET

CREATE TRIGGER trg_DataInsert
ON YourTableName
AFTER INSERT
AS
BEGIN
    BEGIN TRY
        INSERT INTO TargetTable (Column1, Column2)
        SELECT Column1, Column2
        FROM OPENROWSET('SQLNCLI', 
                        'Server=YourServer;Database=YourDatabase;Trusted_Connection=yes;',
                        'SELECT Column1, Column2 FROM SourceTable')
    END TRY
    BEGIN CATCH
        DECLARE @ErrorMessage NVARCHAR(4000),
                @ErrorSeverity INT,
                @ErrorState INT;
        SELECT @ErrorMessage = ERROR_MESSAGE(),
               @ErrorSeverity = ERROR_SEVERITY(),
               @ErrorState = ERROR_STATE();
        RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
    END CATCH
END;

FAQs

Q1: 如何在 SQL Server 中启用 Ad Hoc Distributed Queries?

A1: 可以通过以下命令启用 Ad Hoc Distributed Queries:

EXEC sp_configure 'show advanced options', 1;  
RECONFIGURE;  
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;  
RECONFIGURE;

Q2: 如何解决 OPENROWSET 访问 ORACLE 数据库时遇到的 ORA12154 错误?

A2: 确保在 TNS 配置文件中正确配置了 ORACLE 实例信息,并且如果 SQL Server 是 64 位,确保配置了 64 位的 TNS,确保在 SSMS 中为链接服务器勾选了“Allow inprocess”选项,并重启 SSMS。

本站部分图片及内容来源网络,版权归原作者所有,转载目的为传递知识,不代表本站立场。若侵权或违规联系Email:zjx77377423@163.com 核实后第一时间删除。 转载请注明出处:https://blog.huochengrm.cn/gz/20818.html

分享:
扫描分享到社交APP
上一篇
下一篇