MS-SQLプロシージャでファイルを削除する方法

このQ&Aのポイント
  • SQL Server 2005のプロシージャでテーブルの削除、CSVファイルの取り込み、ファイルの削除を行いたいと思っています。
  • テーブル削除とCSVファイルのインポートはできましたが、ファイルの削除ができません。
  • このプロシージャ内でテキストファイルを削除する方法を教えてください。
回答を見る
  • ベストアンサー

MS-SQLプロシージャでファイルを削除したい

お世話になります。 SQL Server 2005のプロシージャにて テーブルの削除→CSVファイルの取り込み→CSVファイルの削除を行いたいと思っております。 ALTER PROCEDURE [dbo].[テーブル削除+インポート+ファイル削除] AS begin DELETE FROM dbo.テーブル BULK INSERT テーブル FROM 'テキストファイル' WITH (DATAFILETYPE='char', FIELDTERMINATOR=',',ROWTERMINATOR='\n') end ここで、テーブル削除とCSVファイルのインポートはできたのですが、ファイルの削除が未だにできません。 このあとテキストファイルをこのプロシージャ内で削除するにはどうすればよいでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.1

拡張ストアドの xp_cmdshell で可能です。 但し、この拡張ストアドは SQL-Server ユーザーがコマンドラインで実行可能な全ての行為を行なう事ができてしまいます。 それくらい危険極まりないので、デフォルトでは使えないようになっています。 (かつて猛威を振るったワーム型ウイルス Slammer は、確かこの xp_cmdshel を内部で使っていました) 使い方は以下、MSDNを参考に。 xp_cmdshell (Transact-SQL) http://msdn.microsoft.com/ja-jp/library/ms175046.aspx xp_cmdshell オプション http://msdn.microsoft.com/ja-jp/library/ms190693.aspx 企業やプロジェクトによっては、セキュリティの観点から xp_cmdshell の使用を禁止している場合があるかもしれません。 xp_cmdshell 以外にも方法はいくつか考えられます。 ■ストアドからDTSをキックする 自分はやった事無いですが(もしくは忘れてしまいましたが)多分、DTSが使えるのであればファイルの削除も可能でしょう。 ■OLE オブジェクトを使う 例えば、VB(VBA、VBS)などでファイルシステムを扱う場合、 CreateObject("Scripting.FileSystemObject") のように書きます。 これと同じ事をTransact-SQLでは sp_OACreate 'Scripting.FileSystemObject' と表現できます。 つまり、Scripting.FileSystemObjectの DeleteFile メソッドもストアドから実行できる、と言う事です。 こちらの方法は自分もやった事があります 結構ハマり、後々のお守りも大変だった記憶があります。 セキュリティの制限さえ無ければ、xp_cmdshell が一番楽チンです。

MYCABIN
質問者

お礼

ありがとうございます。 やはりプロシージャ内でファイルを削除するには危険が伴うことがわかりました。 そのため、プロシージャを使わずにASP.NET側でデータのインポート⇒ファイルの削除をするようにいたしました。

関連するQ&A

  • SQL SERVERの BULK INSERT

    SQL SERVERの BULK INSERTについて。 TESTというテーブルにtest.csvをBULK INSERTによりデータをインポートしようとしているのですが変数を使わずに下記のように書くと正常に動くのですが、 BULK INSERT TEST FROM 'C:\data\test.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ) 変数を使って下記のようにすると「不適切な構文があります。」とエラーとなってしまいます。 DECLARE @data varchar(100) SET @data = 'C:\data\test.csv' BULK INSERT TEST FROM @data WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ) 解決策を教えてください。

  • プロシージャの引数について

    DB : SQL Server 2005 プロシージャの引数にCSVファイルのフルパスを入れたいのですが、 エラーが出て困っています。 http://questionbox.jp.msn.com/qa262720.html ↑の回答も参考にしましたが、どうしても出来ません。 最初は以下のように書いていました。 BULK INSERT IDATA from ''+ @pass + '' with ( fieldterminator = ',', rowterminator = '\n' ) このときは、プロシージャを作る段階で↓のエラーメッセージが出ました。 >メッセージ 1038、レベル 15、状態 1、プロシージャ sss、行 30 オブジェクト名または列名がないか、空です。SELECT INTO ステートメントの場合は、各列に名前が付いていることを確認してください。その他のステートメントの場合は、空の別名を検索してください。"" または [] で定義された別名は許可されません。別名として、名前または 1 つのスペースを追加してください。 >メッセージ 319、レベル 15、状態 1、プロシージャ sss、行 30 キーワード 'with' 付近に不適切な構文があります。このステートメントが共通テーブル式または xmlnamespaces 句の場合、前のステートメントをセミコロンで終了してください。 また、上記の回答を参考にしたところ、プロシージャは作成できましたが、 引数を与えて実行する段階で↓のエラーメッセージが出ました。 >メッセージ 203、レベル 16、状態 2、プロシージャ sss、行 32 名前 'BULK INSERT IDATA from '\\・・・\・・・\取込.csv' with ( fieldterminator = ',',rowterminator = '\n')' は有効な識別子ではありません。 引数で与えるのでなく、直接入力した場合は出来ます。 よろしくお願いします (><)

  • 【 困 】 ストアドプロシージャ

    OS:WIN2000 DB:SQLServer2000 下記のストアドプロシージャを作成しました。 BULK INSERTを使っています。 引数でCSVファイルのパスを渡そうとしています。 「エラー170:行5: '@Query'の近くに無効な構文があります。」 というエラーになってしまいます。 5行目にあるFromの次に変数を書くには、どうしたらいいのでしょうか? CREATE proc SP_BULK_INSERT @Query char(100) AS BULK INSERT T_顧客マスタ FROM @Query WITH (FIELDTERMINATOR = ',') GO

  • BULK INSERTについて

    CSVをバルクインサートでitemテーブルにBULK INSERTする際に、 下記のようなSQL文を使っているのですが、CSV内のブランク文字は 実行後にNULLになってしまいます。 やりたいことはNULLではなく空白文字("")にしたいのですが、 下記のSQL文をどのように変えればよいのでしょうか。 または、CSVを変更する方法でもよいです。 BULK INSERT item FROM 'c:\test.txt' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ); 大変お手数ですが、 わかる方がいらっしゃいましたらよろしくお願いいたします。

  • BULKINSERTのWITHオプションについて

    SQLserver 2005 Expressを使用してます。 csvをBULKINSERTでインポートする際にcsvの最終行に終了コードのようなデータが 入っていてインポートに失敗します。 BULKINSERTのWITHオプションのLASTROWの引数に変数を使用して 日々行数の変化するcsvの最終行-1の値をセットしたいのですが構文エラーに なります。どのように記述したらいいのでしょうか? 試した事は test.csv 1,あ,4200 2,い,5300 . ← 何かのデータ CREATE PROCEDURE [dbo].[test1] AS bulk insert test_table from 'C:\test.csv' with (firstrow = 1,formatfile = 'C:\Import_Fmt.xml') で実行するとエラー「一括読み込み: データ ファイルで予期しないファイルの終了が検出されました。」になるので、最終行の「.」が原因かと思い。 ALTER PROCEDURE [dbo].[test1] AS bulk insert test_table from 'C:\test.csv' with (firstrow = 1,lastrow = 2,formatfile = 'C:\Import_Fmt.xml') で実行するとエラー無くインポートされました。 実際のcsvは行数10000件はあり日々増減しますので毎回手作業で数えることは難しいです。 そこで一度仮テーブルを作り改行コードまでを一つのカラムにインポートして 行数をカウントし、変数にセットしてLASTROWの引数に渡そうとして ALTER PROCEDURE [dbo].[test1] AS declare @maxseq as int drop table test2 create table test2(F1 varchar(max)) bulk insert test2 from 'C:\test.csv' with (firstrow = 1,formatfile = 'C:\ImportOrg_Fmt2.xml') set @maxseq = (select count([F1]) from test2) --ここにreturn @maxseqを記述して以降を削除して実行し、ストアドを実行したら       --取り込んだcsvの行数が表示されました。 bulk insert test_table from 'C:\data\test.csv' with (firstrow = 1,lastrow = @maxseq -1 ,formatfile = 'C:\ImportOrg_Fmt.xml') と記述して実行すると メッセージ 102、レベル 15、状態 1、プロシージャ test1、行 23 '@maxdeq' 付近に不適切な構文があります。 となりました。 どのように記述したら構文エラーにならずに実行できるかご回答をよろしくお願いします。

  • SQL SERVER で大量データの削除

    delete from table1 where id = 1; delete from table1 where id = 2; delete from table1 where id = 3; もしくは、 delete from table1 where (id = 1) or (id = 2) or (id = 1) という具合のSQLを実行します。 条件は大体20万件程度です。 こちらを実行するとかなり遅いので、 なんとか一括で早く実行する方法はないものでしょうか? 今のところ、プログラムの都合上、プロシージャの中で行なってます。 PROCEDURE UPDATE(@DELSQL nvarchar(max)) EXEC (@DELSQL) @DELSQLに上記SQLが入ります。 大量のINSERTの時は、BULK INSERTのようなやり方があり、 回避できたのですが、困ってます。 どうかよろしくお願いします。

  • 文字列の長さを指定して BULK INSERT するには?

    20,1899-12-3020,1899-12-3020,1899-12-3020,1899-12-30 このような文字列がファイルにあるのですが、 1899-12-30 の部分を、文字数10と指定して データを取り出すことは可能でしょうか? この場合のデータは年齢と生年月日です。 BULK INSERT INTO [BIRTHDAY] FROM 'C:\sql\birthday.txt' WITH (FIELDTERMINATOR = ',', ROWTERMINATOR = '')

  • SQLServerで項目数が異なるCSVファイルを取り込む方法

    (先ほど古いIDで登録してしまったため、削除して新しいIDで登録しなおしました) お世話になります。 SQLServer2005 を使っています。 行によってデータ型も項目数も異なる CSV ファイルがあり、それを テーブルに読み込みたいと思っています。 (POSのデータです) サイズが比較的大きいので、BULK INSERT を使いたいと思い、 以下のように記述してみました。 BULK INSERT T_hoge FROM 'c:\hoge.csv' WITH (  DATAFILETYPE = 'char',  FIELDTERMINATOR = ',',  ROWTERMINATOR = '\n' ) CSV項目数が可変なので、取り込む側のテーブルの項目数に 余裕を持たせ、1行1レコードで取り込みたいのですが、 改行を無視して取り込まれてしまうようです。 項目数可変のCSVを取り込む方法があれば教えてください。 宜しくお願い致します。

  • asp.NET内でSQLプロシージャを実行させた

    お世話になります。  SQL2000+asp.NETの環境で、SQLのプロシージャを実行させようとしています。 このプロシージャはテキストファイルを読み込んでデータベースに追加・削除するもので、ここで使用している関数は  ・DELETE/UPDATE/INSERT  ・BULK INSERT  ・CURSOR です。このプロシージャを実行させるには「.NETユーザー」に対し、  サーバーロールにてbulkadmin  ユーザ権限にてdd_ddladmin の権限を付与すれば実行されることは確認しています。  ここで、ご質問なのですが、asp.NETでプログラミングされていらっしゃる方は、普通にWEBログインユーザーに上記権限を付与していらっしゃるのか知りたいのです。  逆に、この権限付与は危険だからsubプロシージャにて記述したほうがいいよとかお教えいただければ、と思います。  以上よろしくお願いいたします。

  • BULK INSERT でファイルが開けなくて困っています

    初めての質問なのでトンチンカンなこと言ってたらすみません。 SQL Server 2005のストアドプロシージャを使ってBulk InsertでSQL Server とは別のパソコンにあるcsvファイルをテーブルにインポートしようとしているのですが、「...を開けなかったので、一括読み込みできません。...アクセスが拒否されました。」とエラーが出てしまいます。ストアドプロシージャは別パソコンのVB2005からパラメータ(ファイルパス等)を与えて実行しています。 ファイルの保存先フォルダは共有にしています。 ちなみにSQL Server側のパソコンからストアドプロシージャを実行するとちゃんとインポートしてくれます。 パスワードや権限が関係してるんでしょうか? 長くなりましたが、よろしくお願い致します。