「この ISAM では、リンク テーブル内のデータを削除することはできません。」回避方法
<SQL Server ストアドプロシージャ>
リンクサーバーを使い、EXCELファイルへ毎回最新データを上書きしたい時、前回のデータを削除する必要があります。
その際にDELETEコマンドを使用すると「この ISAM では、リンク テーブル内のデータを削除することはできません。」というエラーになります。
調べてみると、なんとDELETEコマンドはサポートされいませんでした。
なんとか回避方法を見つけたので記録しておきます。
■EXCELファイルへの書き出しポイント
・INSERT先は、EXCELの範囲名で指定した範囲の下側 ・INSERT後、範囲は追加したレコードの数だけ拡張される ・2回目のINSERTを行うと、1回目のINSERTしたデータの下側に追加される(範囲が拡張されたため) ・指定した範囲の下側にデータがあるとINSERT出来ない ・UPDATEは指定した範囲が対象 ・DELETEはサポートされていない(エラーとなる)
■DELETE不可の回避方法
・UPDATEで指定範囲にnull値を書き込む ・範囲を初期化する。(項目名の位置)
■サンプル
ALTER PROCEDURE [dbo].[q04業者番号EXCEL書き出し]
AS
BEGIN
-- 書き出しファイル名の設定
DECLARE @filename varchar(255)
SET @filename = '\\Landisk\xxxxxxxx\業者台帳.xls'
-- リンクサーバーの登録有無確認
IF EXISTS(SELECT * from MyExcel...業者番号)
BEGIN
print 'EXIST'
EXEC sp_dropserver MyExcel
END
-- リンクサーバーの登録
EXEC sp_addlinkedserver
@server = 'MyExcel',
@srvproduct = 'OLE DB Provider for Jet',
@provider = 'Microsoft.Jet.OLEDB.4.0',
@datasrc = @filename,
@provstr = 'Excel 8.0'
-- 書き出し済のレコードをクリアする
UPDATE MyExcel...業者番号
SET [業者番号] = null
,[業者名] = null
,[略称] = null
,[連想] = null
,[電話番号] = null
,[郵便番号1] = null
,[郵便番号2] = null
,[住所1] = null
,[住所2] = null
-- EXCEL範囲指定をリセットする
DECLARE @hr int
DECLARE @objXls int
DECLARE @workBooks int
DECLARE @workSheet int
DECLARE @strExec varchar(255)
DECLARE @return_int int
EXEC @hr = sp_OACreate 'Excel.Application', @objXls OUT
SET @strExec = 'Workbooks.Open("' + @filename + '")'
EXEC @hr = sp_OAGetProperty @objXls ,@strExec, @WorkBooks OUT
EXEC @hr = sp_OAGetProperty @WorkBooks, 'Worksheets(1)', @workSheet OUT
EXEC @hr = sp_OAMethod @WorkBooks, 'Names.Add', @return_int OUT, @Name='業者番号', @RefersToR1C1='=業者台帳!R2C1:R2C9'
EXEC @hr = sp_OAMethod @WorkBooks, 'Save'
EXEC @hr = sp_OAMethod @objXls, 'Application.Quit'
EXEC @hr = sp_OADestroy @objXls
-- データをEXCELファイルに書き出す
INSERT INTO MyExcel...業者番号
([業者番号]
,[業者名]
,[略称]
,[連想]
,[電話番号]
,[郵便番号1]
,[郵便番号2]
,[住所1]
,[住所2])
SELECT [業者番号]
,[業者名]
,[略称]
,[連想]
,[電話番号]
,[郵便番号1]
,[郵便番号2]
,[住所1]
,[住所2]
FROM [S11_業者マスタ管理].[dbo].[t01業者台帳]
END