OPENROWSET или OPENDATASOURCE Пример получения данных из файла .xlsx или .csv в файловой системе удаленного сервера

Существует множество примеров, показывающих, как использовать OPENROWSET и OPENDATASOURCE для открытия запросов к таблицам на удаленных SQL-серверах и получения данных из файлов на других серверах. К сожалению, ни один из них не говорит мне, как делать то, что мне нужно сделать, и использовать одну из этих команд для получения файла Excel .csv или .xlsx с удаленного сервера с использованием IP-адреса сервера и входа в Windows, где на сервере не установлен экземпляр SQL Server – только IIS7 или 8.

Было бы замечательно, если бы в документации Microsoft не были опущены основные примеры того, как использовать свои инструменты наиболее вероятными способами. Не требуется реального интеллекта, чтобы попробовать 40 разных комбинаций параметров: это просто неэффективная трата времени. Разработчики имеют более важные дела, чем часы отходов, пытаясь найти рецепт «секретного знания», который на самом деле является просто неправильно документированным вариантом параметров команды и притворяется, что это как-то связано с умением.

Чтобы успокоить мою философскую тоску, мог ли кто-нибудь, пожалуйста, привести пример использования OPENROWSET или OPENDATASOURCE для получения / выбора контента из файла CSV или таблицы Excel с использованием IP-адреса удаленного сервера XXX.XXX.XXX.XXX, номер порта, если он должен быть включен, путь файловой системы, правильно добавленный к этому или включенный в команду, и правильное расположение параметров имени пользователя и пароля. На удаленном сервере нет экземпляра SQL-сервера – только IIS и веб-сайт с окнами auth. Если у вас есть пример, который работает с экземпляром SQL-сервера на удаленном сервере, это будет делать (хотя я думаю, что некоторые из примеров REMOTEDATASOURCE охватывают это уже), но я действительно хочу пример, когда мне не нужно иметь экземпляр SQL-сервера на удаленном веб-сервере.

Я знаю, что для этого вы можете использовать связанные серверы, но есть лишний багаж, чтобы направить удаленный сервер, содержащий файл для доступа, и в моем случае сервер, содержащий текстовый файл excel или .csv, даже не будет иметь SQL Server экземпляр на нем – только IIS и веб-сайт.

(Также – может ли кто-нибудь подтвердить, можете ли вы использовать связанные серверы с NO SQL Server или другим экземпляром сервера базы данных на удаленном сервере с нужным текстовым файлом данных? Связаны ли они только с серверами базы данных или с связанными серверами, где удаленный сервер может просто быть Windows и веб-сервер без сервера SQL, установленного на нем?)

Этот пример удобен, но не говорит мне, может ли SERVERPROPERTY('MachineName') AS nvarchar(128)) содержать IP-адрес удаленного сервера Windows без экземпляра SQL Server на нем, и речь идет не о доступе к текстовым файлам.

Этот пример близок к завершению, но, похоже, нет положительного результата в сообщении, и нет текстового файла – только запрос БД, так что удаленная система имеет установленный 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 * 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-адрес удаленного сервера, а также пароль для входа и имя пользователя? Если это не может, то это противоречит утверждениям о возможности команды в документации (на основе слов, которые они используют), и было бы здорово, если бы они могли сказать «вы не можете этого сделать», так как довольно ясно, что большинство людей попытаются …

 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 или OPENDATASOURCE против таблицы Excel или файла CSV?

Вы можете иметь все свои очки репутации или что бы они ни были, если ваше решение или информация работают (а кто-то еще не получил их первым), потому что меня это не волнует.

Давайте будем гением компьютера.