web-dev-qa-db-ja.com

リモートサーバーのファイルシステム上の.xlsxまたは.csvファイルからデータを取得するOPENROWSETまたはOPENDATASOURCEの例

[〜#〜] openrowset [〜#〜][〜#〜] opendatasource [〜#〜] を使用してクエリを開く方法を示す多くの例がありますリモートSQLサーバー上のテーブルに対して、他のサーバー上のファイルからデータを取得します。残念ながら、これらのいずれも私が行う必要のある特定のことを行う方法を教えていません。これらのコマンドの1つを使用して、サーバーのIPアドレスとWindowsのログインを使用してリモートサーバーから.csvまたは.xlsx Excelファイルを取得します。サーバーにnoSQL Serverインスタンスがインストールされている-IIS7または8のみ。

Microsoftのドキュメントで、最も可能性の高い方法でツールを使用する方法の基本的な例を省略していなかったらすばらしいでしょう。パラメータリストの40の奇妙な異なる組み合わせを試すのに本当の知性は必要ありません。それは時間の無駄なだけです。開発者は、実際には適切に文書化されていないコマンドパラメータの変種である「秘密の知識」のレシピを見つけようと何時間も無駄にして、これが賢いことと関係しているふりをするよりも重要なことをします。

したがって、私の哲学的な不安を和らげるために、OPENROWSETまたはOPENDATASOURCEを使用して、.csvファイルまたはリモートサーバーのIPアドレスXXX.XXX.XXX.XXXを使用するExcelスプレッドシートからコンテンツを取得/選択する方法の例を誰かに提供していただけませんか。ポート番号を含める必要がある場合は、ポート番号、ファイルシステムのパスが正しく追加されているか、コマンドに含まれていること、およびユーザー名とパスワードのパラメーターの正しい配置。リモートサーバーにはSQLサーバーインスタンスがありません。IISとWindows認証を備えたWebサイトだけです。リモートサーバーのSQLサーバーインスタンスで動作する例がある場合、それは(ただし、 REMOTEDATASOURCEの例のいくつかはこれをすでにカバーしていると思います)が、リモートWebサーバーにSQLサーバーインスタンスを配置する必要がない例を本当に望んでいます。

これにはリンクサーバーを使用できることを知っていますが、アクセスするファイルを含むリモートサーバーに追加の手荷物があり、私の場合、Excelまたは.csvテキストファイルを含むサーバーにはSQLサーバーさえありません。その上のインスタンス-IISおよびWebサイトのみ。

(また、リンクサーバーをSQL Serverなしで使用できるかどうか、またはリモートサーバー上の他のデータベースサーバーインスタンスを目的のテキストデータファイルで使用できるかどうかを誰かが確認できますか?リンクデータベースサーバーのみですか、それともリモートサーバーが単にSQLサーバーがインストールされていないWindowsおよびWebサーバー?)

この例 は便利ですが、SERVERPROPERTY('MachineName') AS nvarchar(128))にSQLサーバーインスタンスのないリモートWindowsサーバーのIPアドレスを含めることができ、テキストへのアクセスに関するものかどうかはわかりませんファイル。

この例 は非常に接近していますが、投稿に肯定的な結果は見られず、テキストファイルは含まれていません-DBクエリのみなので、リモートシステムに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') 

source 。ここでの{SQL Server}は、リモートIPアドレスではなくSQLサーバー名である必要があると思いますか?明確ではありません。)

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

ソース 。ここでも-いいえremoteサーバー、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;

つまり、適切な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$] ;

そう、

何かのようなもの:

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-ボーリングボーリングボーリング)

リンクサーバーをあきらめて使用する必要があります。

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で簡単に始めましょう。さまざまな理由でリンクサーバーを避けたかったのです。 Excelスプレッドシートまたは.csvファイルに対してOPENROWSETまたはOPENDATASOURCEをどのように使用しますか?

あなたが私の評判ポイントのすべてまたはそれらがあなたの解決策または情報が機能する場合はそれらを何でも持つことができます(そして他の誰かが最初にそれらを取得しませんでした)。

9
Bruce Long

単に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';
1

Csvファイルにリンクする場合は、Erland Sommarskogが非常に優れた記事 here で、OPENROWSET(BULK)の実用的な使用法とBCPおよびBULK IMPORTについて説明しています。彼が詳細に指摘しているように、特に2017年より前のバージョンのSQL Serverに悩まされている場合は、いくつかの落とし穴があります。

Csvファイルのレイアウトでは、事前の処理なしにOPENROWSET(BULK)を使用できない場合があります。記事では詳細を説明しています。ただし、可能であれば、大量のテキストをSQL Serverデータベースに取り込むための最も速い方法です。

0
marktwo

以下は、opendatasourceとアクセステキストドライバー64ビットを使用したCSVインポートの簡単なSQLクエリです。

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