4

これは機能します:

SELECT * FROM OPENDATASOURCE( 
       'Microsoft.ACE.OLEDB.12.0', 
       'Data Source=d:\JobFiles\MyFile.xlsx; 
        Extended properties=Excel 8.0')...MySheet$

これもそうです:

INSERT INTO OPENDATASOURCE( 
       'Microsoft.ACE.OLEDB.12.0', 
       'Data Source=d:\JobFiles\MyFile.xlsx; 
        Extended properties=Excel 8.0')...MySheet$
SELECT * FROM blahblahblah

では、なぜですか?

DELETE FROM OPENDATASOURCE( 
        'Microsoft.ACE.OLEDB.12.0', 
        'Data Source=d:\JobFiles\MyFile.xlsx;
         Extended properties=Excel 8.0')...MySheet$

私は本当に運が悪いので、いくつかの検索を行いました。結局のところ、新しいデータを挿入する前に削除されたExcel行だけが必要であり、SQLのみでこれを達成したいと考えています。

4

2 に答える 2

4

OPENDATASOURCE を介して行全体を削除することはできません。http://support.microsoft.com/kb/257819によると:

消去

Excel データの削除は、リレーショナル データ ソースのデータよりも制限されています。リレーショナル データベースでは、「行」は「レコード」以外に意味も存在もありません。Excel ワークシートでは、これは当てはまりません。フィールド (セル) の値を削除できます。ただし、次のことはできません。

  • レコード全体を一度に削除しないと、次のエラー メッセージが表示されます。

リンク テーブル内のデータの削除は、この ISAM ではサポートされていません。

個々のフィールドの内容を空白にすることによってのみ、レコードを削除できます。

  • Excel 数式を含むセルの値を削除しないと、次のエラー メッセージが表示されます。

このコンテキストでは操作は許可されていません。

  • 削除されたデータがあったスプレッドシートの空の行を削除することはできません。レコードセットには、これらの空の行に対応する空のレコードが引き続き表示されます。
于 2013-05-31T03:37:00.137 に答える
4

Yuryy さん、ありがとうございます。

私の状況の他の人にとって、これは私の「最もクリーンな」回避策でした:ファイルの空のバージョン(私の場合は「MyFileBlank.xlsx」)を取得し、以下に従ってください:

--delete existing file
exec master..xp_cmdshell 'del d:\JobFiles\MyFile.xlsx' 
go

--create new file from blank template
exec master..xp_cmdshell 'copy d:\JobFiles\MyFileBlank.xlsx d:\JobFiles\MyFile.xlsx' 
go

INSERT INTO OPENDATASOURCE( 'Microsoft.ACE.OLEDB.12.0',
       'Data Source=d:\JobFiles\MyFile.xlsx; 
        Extended properties=Excel 8.0')...MySheet$
SELECT * FROM blahblahblah
于 2013-05-31T04:29:55.700 に答える