OPENROWSET或OPENDATASOURCE从远程服务器的文件系统上的.xlsx或.csv文件获取数据的示例

Bru*_*ong 9 sql-server csv excel linked-server openrowset

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

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

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

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

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

这个例子很方便,但是不告诉我是否SERVERPROPERTY('MachineName') AS nvarchar(128)) 可以包含没有SQL服务器实例的远程Windows服务器的IP地址,它不是关于访问文本文件.

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

SELECT * 
FROM OPENROWSET('PACISOleDb', '192.168.200.172';'admin';'admin', 'SELECT * FROM DB')
Run Code Online (Sandbox Code Playgroud)

现有的例子很好,但没有多大帮助:

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

(来源)

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

(来源)

-- 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   
Run Code Online (Sandbox Code Playgroud)

(来源)

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

(来源.我认为{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
Run Code Online (Sandbox Code Playgroud)

(来源)

--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$]');
Run Code Online (Sandbox Code Playgroud)

(来源.再次 - 没有远程服务器,没有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$]);
Run Code Online (Sandbox Code Playgroud)

(来源)

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;  
Run Code Online (Sandbox Code Playgroud)

H.从没有格式文件的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;
Run Code Online (Sandbox Code Playgroud)

因此,我认为正确的OR ONLY方法涉及OPENDATASOURCE,喷气机驱动器存在并可在远程服务器上访问.但是,在MS的以下示例中,远程服务器的IP地址以及登录密码和用户名是什么?如果它不能那么这似乎与文档中命令的能力声明(基于他们使用的单词)相矛盾,如果他们可以说"你不能这样做"会很好,因为很明显大多数人都会尝试......

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

所以,

就像是:

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$] ;
Run Code Online (Sandbox Code Playgroud)

或者可能

(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
Run Code Online (Sandbox Code Playgroud)

但是,我可以:

@server ='202.217.XXX.XXX'

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

如果您的解决方案或信息有效(而其他人没有先得到它们),您可以拥有我所有的声誉点或任何声望点,因为我不关心那些东西.

小智 2

只需使用 Windows 共享路径即可。

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';
Run Code Online (Sandbox Code Playgroud)