我使用RODBC向SQL-Server发送查询。有时它们需要花费太多时间才能运行,所以我需要取消它们。
点击红色"停止" RStudio中的按钮会产生以下错误消息:
R没有响应您的中断处理请求以便停止 您可能需要完全终止R的当前操作。
终止R将导致您的R会话立即中止。活性 计算将被中断,未保存的源文件将更改 工作空间对象将被丢弃。
你想现在终止R吗?
如果我单击是,我的会话确实已终止。 (注意:使用Rgui代替RStudio并不能让事情变得更好)
然而:
当我使用另一个软件(名为" Query ExPlus")连接到同一个SQL-Server时,我有一个类似的停止按钮,点击它会立即中断查询,没有任何崩溃
当我使用RPostgres包连接到PostgreSQL数据库时,我也可以随时中断查询。
这两点让我觉得应该有办法解决我的问题。我该怎么办?
到目前为止,我的解决方法是:
library(RODBC)
library(R.utils)
withTimeout(mydf <- sqlQuery(myconnection, myquery), timeout=120)
注意:我没有权限从数据库端终止查询。
答案 0 :(得分:7)
我偶然发现了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
个参数答案 1 :(得分:1)
大多数SQL Server用户使用SQL Server Management Studio(可免费下载并可从Microsoft下载)连接到SQL Server或通过名为SQLCMD的工具从命令行执行命令。
如果您可以确定正在运行SQL命令的会话ID,则可以终止会阻止任何正在执行的命令的会话。 SQL Server仍然需要时间(可能是一个很长的时间)来回滚在执行命令期间所做的任何更改。
终止会话(取决于软件)可能需要一段时间才能与SQL Server通信会话已终止。当我使用链接服务器从SQL Server连接到DB2时,DB2将缓冲terminate命令,并且DB2通常需要一个小时来实现会话已终止。
要确定您正在运行的会话,您可以尝试:
select @@spid;
一旦你有了spid(比方说86) 然后你可以发出(取决于你是否有权这样做)
kill 86;
但微软指出: 终止基于会话ID或工作单元(UOW)的用户进程。如果指定的会话ID或UOW需要大量撤消工作,则KILL语句可能需要一些时间才能完成,特别是涉及回滚长事务时。
答案 2 :(得分:-2)
尝试在SQL Server Management Studio上关闭“标签查询” 然后会出现弹出窗口,
此查询当前正在执行。要取消此查询吗?
取消无论如何,选择“是”。
答案 3 :(得分:-2)
尝试在查询之前设置连接:
sql = odbcConnect('Database name')
然后使用相同的行来运行查询:
mydf <- sqlQuery(sql, " myquery ")
注意:运行时间取决于数据库和R服务器,但以这种方式设置连接应解决终止问题。