OPENROWSET或OPENDATASOURCE从远程服务器

时间:2017-05-06 02:50:33

标签: sql-server excel csv linked-server openrowset

有很多示例可以展示如何使用OPENROWSETOPENDATASOURCE打开远程SQL服务器上的表的查询,以及从其他服务器上的文件中获取数据。不幸的是,他们都没有告诉我如何做我需要做的具体事情,这是使用其中一个命令从远程服务器获取.csv或.xlsx Excel文件使用服务器IP地址和Windows登录服务器安装了 no SQL Server实例 - 只有IIS7或8。

如果Microsoft文档没有省略如何以最可能的方式使用他们的工具的基本示例,那将是很好的。尝试40多种不同的参数组合列表并不是真正的智能:它只是浪费时间的低效率。开发人员有更多重要的事情要做,而不是浪费时间去发现一些秘密知识'配方实际上只是一个没有正确记录的命令参数变体,并假装这与聪明的事情有关。

为了减轻我的哲学焦虑,有人可以提供一个示例,说明如何使用OPENROWSET或OPENDATASOURCE来使用远程服务器IP地址XXX.XXX.XXX从.csv文件或Excel电子表格中获取/选择内容.XXX,如果应包含端口号,则正确附加到该命令或包含在命令中的文件系统路径,以及用户名和密码参数的正确排列。远程服务器上没有SQL服务器实例 - 只有IIS和具有Windows身份验证的网站。如果你有一个与远程服务器上的SQL服务器实例一起使用的例子,那就行了(尽管我认为一些REMOTEDATASOURCE示例已经涵盖了这一点)但我真的想要一个我不必拥有SQL的例子远程Web服务器上的服务器实例。

我知道您可以使用链接服务器,但是要在包含要访问的文件的远程服务器上放置一些额外的行李,在我的情况下,包含excel或.csv文本文件的服务器甚至不会一个SQL Server实例 - 只有IIS和一个网站。

(另外 - 有人可以确认您是否可以使用具有所需文本数据文件的远程服务器上没有SQL Server或其他数据库服务器实例的链接服务器?它是仅链接数据库服务器,还是远程服务器可以链接的服务器只是一个没有安装SQL服务器的Windows和Web服务器?)

This example很方便,但不会告诉我SERVERPROPERTY('MachineName') AS nvarchar(128)) 可以包含远程Windows服务器的IP地址,其上没有SQL服务器实例,也不是访问文本文件。

This example非常接近,但在帖子中似乎没有积极的结果,并且没有涉及文本文件 - 只有数据库查询所以远程系统安装了SQL服务器?:

SELECT * 
FROM OPENROWSET('PACISOleDb', '192.168.200.172';'admin';'admin', 'SELECT * FROM DB')

现有的例子很好,但不是很有用:

SELECT *
FROM OPENROWSET('SQLNCLI',
   'DRIVER={SQL Server};SERVER=YourServer;UID=UserID;PWD=Password',
   'select * from sys.sysobjects')

Source

SELECT ContactName, CompanyName, ContactTitle
FROM OPENDATASOURCE('SQLOLEDB',
              'Data Source=ServerName;User ID=MyUID;Password=MyPass' ).Northwind.dbo.Customers

source

-- SQL Server 2012
SELECT
    *
FROM
    OPENDATASOURCE ('SQLNCLI11', 
   'Data Source=SQLInstanceName;Catalog=DBName;User ID=SQLLogin;Password=Password;').DBName.SchemaName.TableName


SELECT *
FROM OPENROWSET('SQLNCLI11',
   'DRIVER={SQL Server};SERVER=SQLInstanceName;UID=SQLLogin;PWD=Password',
   'select * from DBName..TableName')  

--Access DB
SELECT * FROM OPENDATASOURCE ('Microsoft.ACE.OLEDB.12.0', 
                              'Data Source=D:\MyDB\MyAccessDB.accdb')...TableName   

source

SELECT *
FROM OPENROWSET('SQLNCLI',
   'DRIVER={SQL Server};SERVER=MyServer;UID=MyUserID;PWD=MyCleverPassword',
   'select @@ServerName') 

source。我认为{SQL Server}必须是SQL服务器名称 - 而不是远程IP地址?目前尚不清楚。)

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

source

--Excel 2007-2010
SELECT * --INTO #productlist
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
    'Excel 12.0 Xml;HDR=YES;Database=C:\temp\Products.xlsx',
    'SELECT * FROM [ProductList$]');

--Excel 97-2003
SELECT * --INTO #productlist
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0',
    'Excel 8.0;HDR=YES;Database=C:\temp\Products.xls',
    'select * from [ProductList$]');

source。再次 - 没有远程服务器,没有IP服务器地址,没有凭据)

很多可以从这里选择。伟大的博客文章,但对我的特定目的无用:

SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
  'Excel 12.0 Xml;
   Database=C:\DataFiles\EmployeeData1.xlsx',
   [vEmployee$]); 

SELECT * 
FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0',
  'Data Source=C:\DataFiles\EmployeeData1.xlsx;
   Extended Properties=Excel 12.0 Xml')...[vEmployee$];

SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
  'Excel 12.0 Xml; HDR=YES;
   Database=C:\DataFiles\EmployeeData1.xlsx',
   [vEmployee$]);

SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
  'Excel 12.0 Xml; HDR=NO;
   Database=C:\DataFiles\EmployeeData1.xlsx',
   [vEmployee$]);

SELECT * INTO EmployeeInfo3
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
  'Excel 12.0 Xml; HDR=YES; IMEX=1;
   Database=C:\DataFiles\EmployeeData1.xlsx',
   [vEmployee$]);

source

MS openrowset文档有一个' |'在命令模式中建议无法远程完成:

SELECT *
FROM OPENROWSET(BULK N'D:\XChange\test-csv.csv',
    FORMATFILE = N'D:\XChange\test-csv.fmt', 
    FIRSTROW=2, 
    FORMAT='CSV') AS cars;  

小时。从没有格式文件的CSV文件访问数据:

    tsql
     Copy
    SELECT * FROM OPENROWSET(
       BULK 'C:\Program Files\Microsoft SQL Server\MSSQL14.CTP1_1\MSSQL\DATA\inv-2017-01-19.csv',
       SINGLE_CLOB) AS DATA;

So I am thinking that the correct OR ONLY approach involves OPENDATASOURCE with the jet driver present and accessible on the remote server. However, where in the following example from MS does the IP address of the remote server and the login password and username go? If it cannot then that seems contradictory to the claims of the capability of the command in the documentation (based on the words they use), and it would be great if they could say 'you cannot do this', as it is pretty clear that most people will try...

SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0',  
'Data Source=C:\DataFolder\Documents\TestExcel.xls;Extended Properties=EXCEL 5.0')...[Sheet1$] ;

所以,

类似的东西:

SELECT * FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0'|'Microsoft.Jet.OLEDB.4.0'|'PACISOleDb', 'Data Source=XXX.XXX.XXX.XXX\DataFolder\Documents\TestExcel.xls';User ID=MyUID;Password=MyPass;Extended Properties=EXCEL 5.0')...[Sheet1$] ;

或者

(TWIDDLING THUMBS - BORING BORING BORING)

我应该放弃并使用链接服务器:

EXEC sp_addlinkedserver
  @server = 'ExcelLinkSrv1',
  @srvproduct = 'Excel', 
  @provider = 'Microsoft.ACE.OLEDB.12.0',
  @datasrc = 'C:\DataFiles\EmployeeData1.xlsx',
  @provstr = 'Excel 12.0 Xml; HDR=YES; IMEX=1';
GO

但是,我可以:

@server =' 202.217.XXX.XXX'

是的 - 我知道你通常不会硬编码,但让我们在SSMS中开始变得简单。我想出于不同的原因避免使用链接服务器。如何使用OPENROWSET或OPENTATASOURCE对excel电子表格或.csv文件进行操作?

如果您的解决方案或信息有效(而其他人没有先获得),您可以拥有我所有的声誉点或其他任何声誉点,因为我不关心这些事情。

3 个答案:

答案 0 :(得分:1)

Simply use windows sharepaths for that.

EXEC sp_addlinkedserver
@server = 'ExcelLinkSrv1',
@srvproduct = 'Excel', 
@provider = 'Microsoft.ACE.OLEDB.12.0',
@datasrc = '\\SERVEROTHER\c$\DataFiles\EmployeeData1.xlsx',
@provstr = 'Excel 12.0 Xml; HDR=YES; IMEX=1';

答案 1 :(得分:0)

如果要链接到csv文件,Erland Sommarskog有一篇非常不错的文章:here,其中讨论了OPENROWSET(BULK)以及BCP和BULK IMPORT的实际用法。正如他详细指出的那样,有很多陷阱,尤其是如果您在2017年之前仍使用SQL Server版本。

如果没有事先处理,csv文件的布局可能不允许您使用OPENROWSET(BULK)。本文提供了完整的细节。但是,如果可能的话,这是将大量文本插入SQL Server数据库的最快方法。

答案 2 :(得分:0)

这是使用opendatasource和64位访问文本驱动程序进行CSV导入的简单SQL查询

SELECT * FROM OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0',
                             'Text;Database=D:\TEMP;HDR=YES')..[pdf_attachment#csv]