2013-05-31 54 views
4

這工作:SQL服務器:DELETE FROM OPENDATASOURCE

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

您無法通過OPENDATASOURCE刪除整行。據http://support.microsoft.com/kb/257819

刪除

您有更多地限制在刪除Excel中的數據比從 關係數據源的數據。在關係數據庫中,「行」沒有意義 或除「記錄」以外的存在;在Excel工作表中,這不是 是真的。您可以刪除字段(單元格)中的值。但是,你不能:

  • 一次性刪除整個記錄或者您會收到以下錯誤信息:

刪除鏈接表中數據不受此ISAM支持。

您只能通過清空每個 個別字段的內容來刪除記錄。

  • 刪除在含有一個Excel公式的單元格的值或收到以下錯誤消息:

不允許操作在此上下文中。

  • 不能刪除其中刪除數據的位置,並記錄集將繼續顯示對應於這些空行空 記錄的空白電子表格行(S)。
4

謝謝尤里裏 - 這就是我的想法。

對於我的情況任何人,這是我的「乾淨」的解決方法:獲得文件的空白版本(對我來說,「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