【问题标题】:Cannot initialize the data source object of OLE DB provider "MSDASQL" for linked server "(null)"无法为链接服务器“(null)”初始化 OLE DB 提供程序“MSDASQL”的数据源对象
【发布时间】:2025-11-21 22:00:01
【问题描述】:

有一个有趣的问题。我正在通过 Sql2005 中的 OpenRowset 从服务器上的 excel 文件中读取数据。我已经多次运行查询,没有任何问题。我刚出去参加一个快速会议,突然收到错误消息“无法为链接服务器“(null)”初始化 OLE DB 提供程序“MSDASQL”的数据源对象”

我已经确定服务器上没有使用这些文件,甚至删除了它们并将它们重新复制到服务器上,但我仍然遇到同样的错误。

更新:这似乎只有在我加入来自不同 openrowset 的两个选择时才会发生。如果我单独运行查询,它们仍然可以正常工作。我之前已经完成了加入,没有任何问题。想法?

【问题讨论】:

    标签: sql-server-2005 openrowset msdasql


    【解决方案1】:

    出现问题是因为在运行查询的凭据下无法访问运行 SQL Server 服务的用户的 Temp 文件夹。尝试以最小的限制设置此临时文件夹的安全性。每次运行 openrowset 查询时创建的 dsn 可以重新创建而不会发生任何凭据冲突。这对我有用,没有任何重启要求。

    【讨论】:

    • 在哪里可以找到这个 Temp 文件夹?
    • 对于我们的特定配置 - Windows Server 2008 R2、SQL Server 2008 R2 - 我们需要与域用户共享的特定 TEMP 文件夹是:C:\Users\<SQL Server Service Account Name>\AppData\Local\Temp
    • 我已经花了一整天的时间 - 我不敢相信这是解决方案!但它奏效了,所以我很高兴。
    • 如果没有新共享的权限,您将只能通过在 SQL Server 上打开 SSMS 在本地运行脚本。另一种方法是将您自己的域帐户添加到本地 (SQL Server) 管理员组,它的作用相同。
    • 非常感谢,这个答案为我们节省了很多时间!
    【解决方案2】:

    我们最终重新启动了数据库服务器,这似乎解决了问题。也许文件以某种方式被锁定。不过我们永远无法确定

    【讨论】:

    • 服务器重启也对我有用。在执行输入的存储过程中结束了脚本链接服务器的创建/删除。
    • 重启服务器对我来说很有魅力。谢谢你,我不敢相信我花了多少时间来解决这个问题。谢谢
    【解决方案3】:

    我必须下载并安装可用的“Microsoft Access Database Engine 2010 Redistributable”here

    “这个问题的原因是您的 64 位 Windows server 2003 上实际上没有安装 64 位 ODBC 文本驱动程序。64 位 MSDASQL 只是提供了一个 OLEDB/ODBC '桥',允许应用程序构建在OLEDB 和 ADO(在内部使用 OLEDB)通过 ODBC 驱动程序访问数据源。” Source

    【讨论】:

      【解决方案4】:
      /* Linked server between local(Client) SQL server and Remote SQL server 2005*/
      
      USE master
      GO
      -- To use named parameters: Add linked server in the source (Local machine - eg: MachineName or LocalSeverLoginName)
      
      sp_addlinkedserver 
       @server = N'LnkSrv_RemoteServer_TEST', 
       @srvproduct=N'', -- Leave it blank when its not 'SQL Server'
       @provider=N'SQLNCLI', -- see notes
       @datasrc=N'RemoteServerName', 
       @provstr=N'UID=sa;PWD=sa;'
       --,@catalog = N'MYDATABASE' eg: pubs
      GO
      
      /*
       Note: 
        To check provider name use the folling query in the destination server
         Select Provider From sys.servers
      */
      ----------------------------------------------------------------------------------------------------------
      -- Optional
      --EXEC sp_addlinkedsrvlogin 'LnkSrv_RemoteServer_TEST', 'true' -- (self is true) -- for LocalSeverLoginName
      --GO
      
      -- Remote login
      sp_addlinkedsrvlogin
       @rmtsrvname = 'LnkSrv_RemoteServer_TEST',
       @useself = 'False',
       @rmtuser = 'sa',
       @rmtpassword = 'sa'
      GO
      
      -- OR
      /*
      IF the above add linked server login failed then try in the Linked Server (LnkSrv_RemoteServer_TEST) Property 
      Select -> Security - > 'For a login not defined in the list above, Connection will:'
      
      Choose - > Be made using this security context
      SET Remote login: sa
      With password: sa
      */
      ----------------------------------------------------------------------------------------------------------
      
      -- Test server connection
      declare @srvr nvarchar(128), @retval int;
      set @srvr = 'LnkSrv_RemoteServer_TEST';
      begin try
          exec @retval = sys.sp_testlinkedserver @srvr;
      end try
      begin catch
          set @retval = sign(@@error);
      end catch;
      if @retval <> 0
        raiserror('Unable to connect to server. This operation will be tried later!', 16, 2 );
      
      -- OR
      
      BEGIN TRY 
          EXEC sp_testlinkedserver N'LnkSrv_RemoteServer_TEST'; 
      END TRY 
      BEGIN CATCH 
          PRINT 'Linked Server not available'; 
          RETURN; 
      END CATCH 
      ----------------------------------------------------------------------------------------------------------
      
      -- Get access linked server database
      SET xact_abort ON 
      GO
      
      BEGIN TRANSACTION
      SELECT  *  FROM LnkSrv_RemoteServer_TEST.DBName.dbo.tblName 
      COMMIT TRAN
      GO
      
      -- OR
      SELECT * FROM OPENQUERY(LnkSrv_RemoteServer_TEST, 'SELECT * FROM DBName.dbo.tblName')
      GO
      
      -- OR
      SELECT * FROM OPENQUERY(LnkSrv_RemoteServer_TEST, 'SELECT * FROM sys.databases Order by name')
      GO
      ----------------------------------------------------------------------------------------------------------
      

      【讨论】:

        【解决方案5】:

        这个问题也发生在我身上。为 OraOLEDB.Oracle 提供(SSMS > 服务器对象 > 链接服务器 > 提供 > OraOLEDB.Oracle)启用“允许进程内”提供程序选项的组合,重新启动 SQL Server Windows 服务并最后调整 TNSNAMES.ora 文件的权限直接。

        【讨论】:

          【解决方案6】:

          我认为您使用 32 位驱动程序制作了 ODBC,但 SQL Server Management Studio 需要 64 位。因为当您想在 SQL Server 上为 MYSQL 创建链接服务器时,就会发生这种情况。所以,你应该让 DSN 系统使用 64 位驱动程序

          【讨论】:

            最近更新 更多