如何停止正在运行的查询?

时间:2017-05-12 17:14:32

标签: sql-server r rodbc

我使用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)

注意:我没有权限从数据库端终止查询。

4 个答案:

答案 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还有其他优势:

  • 真的更快
  • 从数据库中获取列类型而不是猜测它们(请参阅here
  • 不需要stringsAsFactorsas.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服务器,但以这种方式设置连接应解决终止问题。