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

大量的例子展示了如何使用OPENROWSET和OPENDATASOURCE打开对远程SQL服务器上的表的查询,并从其他服务器上的文件中获取数据。 不幸的是,他们没有一个告诉我如何做我需要做的具体的事情,这是使用这些命令之一来获得一个.csv或.xlsx Excel文件从远程服务器使用服务器的IP地址和Windowslogin的地方服务器没有安装SQL Server实例 – 只有IIS7或8。

如果微软文档没有忽略如何以最可能的方式使用他们的工具的基本例子,那将是非常好的。 尝试40多种不同的参数列表组合,并不需要真正的智能:这只是一种低效的浪费时间。 开发人员有更重要的事情要做,而不是浪费时间来发现一些“秘密知识”的秘诀,这个秘诀实际上只是一个没有正确logging的命令参数变体,并假装这是聪明的事情。

因此,为了减轻我的哲学焦虑,有人可以提供一个例子,说明如何使用OPENROWSET或OPENDATASOURCE从.csv文件或Excel电子表格中使用远程服务器IP地址XXX.XXX.XXX.XXX获取/select内容,一个端口号(如果应该包括的话),文件系统path正确地附加到命令或包含在命令中,以及正确安排用户名和密码参数。 远程服务器上没有SQL服务器实例 – 只有IIS和带有Windows身份validation的网站。 如果你有一个在远程服务器上与SQL服务器实例一起工作的例子,那么这样做(尽pipe我认为REMOTEDATASOURCE的一些例子已经包含了这个例子),但是我真的想要一个例子,我不必拥有一个SQL服务器实例在远程Web服务器上。

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

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

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

这个例子很接近,但在post里似乎没有一个积极的结果,也没有涉及到文本文件 – 只有一个数据库查询,所以远程系统安装了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') 

( 来源 )

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

( 来源 )

 -- 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 

( 来源 )

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

( 来源:我认为{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 

( 来源 )

 --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$]'); 

( 来源 。再次 – 没有远程服务器,没有IP服务器地址,没有凭据)

很多从这里select。 伟大的博客文章,但没有用于我的具体目标:

 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$]); 

( 来源 )

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; 

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; 

所以我认为正确的或唯一的方法涉及OPENDATASOURCE喷气机驱动程序存在,并在远程服务器上访问。 但是,在下面的例子中,来自MS的远程服务器的IP地址以及login密码和用户名都去了哪里? 如果不能这样做,那么这与命令在文档中的能力主张(基于他们使用的词语)似乎是矛盾的,如果他们能说'你不能这样做',那将是非常好的,因为它很清楚大多数人会尝试…

 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$] ; 

或者可能

(TWDDLING 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或OPENDATASOURCE来处理excel电子表格或.csv文件?

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