RODBCを使用して、クエリをSQLサーバーに送信します。実行に時間がかかりすぎる場合があるため、キャンセルする必要があります。
RStudioの赤い「停止」ボタンをクリックすると、次のエラーメッセージが表示されます。
Rは処理を中断する要求に応答しないため、現在の操作を停止するには、Rを完全に終了する必要があります。
Rを終了すると、Rセッションが直ちに中止されます。アクティブな計算は中断され、保存されていないソースファイルの変更とワークスペースオブジェクトは破棄されます。
今すぐRを終了しますか?
そして、はいをクリックすると、私のセッションは実際に終了します。 (注:RStudioの代わりにRguiを使用しても、状況は改善されません)
しかしながら:
別のソフトウェア(「Query ExPlus」という名前)を使用してこの同じSQL-Serverに接続すると、同様の停止ボタンがあり、それをクリックすると、クラッシュすることなく即座にクエリが中断されます。
rPostgresパッケージを使用してPostgreSQLデータベースに接続すると、いつでもクエリを中断できます。
これらの2つのポイントは、私の問題を解決する方法があるべきだと思うように導きます。私に何ができる?
これまでのところ、私の回避策は次のとおりです。
library(RODBC)
library(R.utils)
withTimeout(mydf <- sqlQuery(myconnection, myquery), timeout=120)
注:データベース側からのクエリを強制終了する権限がありません。
odbc
パッケージを見つけました。いつでもクエリを中断できます。
基本的な使用方法は次のとおりです。
library(DBI)
myconnection <- dbConnect(odbc::odbc(),
driver = "SQL Server",
server = "my_server_IP_address",
database = "my_DB_name",
uid = "my_user_id",
pwd = "my_password")
dbGetQuery(myconnection, myquery)
私は舞台裏で何が起こっているのかを深く理解していませんが、これまでの私の個人的な使用で見てきたことから、このパッケージにはRODBC
に対して他の利点があります。
stringsAsFactors
およびas.is
引数が必要ですほとんどのSQL Serverユーザーは、SQL Server Management Studio(無料でMicrosoftからダウンロード可能)を使用してSQL Serverに接続するか、SQLCMDと呼ばれるツールを介してコマンドラインからコマンドを実行します。
SQLコマンドが実行されているセッションIDを特定できる場合は、実行中のコマンドを停止するセッションを強制終了できます。 SQL Serverには、コマンドの実行中に行われた変更をロールバックするための時間が必要です(「長い」時間になる可能性があります)。
セッションの終了(ソフトウェアによって異なります)は、セッションが終了したことをSQL Serverと通信するのに時間がかかる場合があります。リンクサーバーを使用してSQL ServerからDB2に接続すると、DB2は終了コマンドをバッファリングし、セッションが終了したことをDB2が認識するまでに最大1時間かかることがよくありました。
実行中のセッションを確認するには、次を試してください。
select @@spid;
spid(86と言う)を取得したら、発行できます(許可があるかどうかによって異なります)
kill 86;
ただし、Microsoftの注意事項:セッションIDまたは作業単位(UOW)に基づいたユーザープロセスを終了します。指定されたセッションIDまたはUOWを元に戻す作業が多い場合、特に長いトランザクションのロールバックを伴う場合、KILLステートメントの完了に時間がかかる場合があります。