sql-server - reiniciar - servicio sql server no inicia automaticamente
¿Cómo detener una consulta en ejecución? (4)
Yo uso RODBC para enviar consultas a un servidor SQL. A veces tardan mucho tiempo en ejecutarse, así que necesito cancelarlos.
Al hacer clic en el botón rojo "detener" en RStudio aparece este mensaje de error:
R no responde a su solicitud de interrumpir el procesamiento, por lo que para detener la operación actual, es posible que deba finalizar R por completo.
Terminar R hará que tu sesión R aborte inmediatamente. Los cálculos activos se interrumpirán y los cambios del archivo fuente no guardado y los objetos del área de trabajo se descartarán.
¿Quieres terminar R ahora?
Y si hago clic en sí, mi sesión está terminada. (nota: usar Rgui en lugar de RStudio no mejora las cosas)
Sin embargo:
cuando utilizo otro software (llamado "Query ExPlus") para conectarme a este mismo servidor SQL, tengo un botón de parada similar y al hacer clic en él se interrumpe la consulta al instante, sin ningún bloqueo.
Cuando me conecto a una base de datos PostgreSQL utilizando el paquete RPostgres, también puedo interrumpir la consulta en cualquier momento.
Estos dos puntos me llevan a pensar que debería haber una manera de resolver mi problema. ¿Que puedo hacer?
Hasta ahora mi solución es:
library(RODBC)
library(R.utils)
withTimeout(mydf <- sqlQuery(myconnection, myquery), timeout=120)
Nota: No tengo permiso para eliminar consultas del lado de la base de datos.
Acabo de encontrarme con el paquete odbc
. Permite interrumpir una consulta en cualquier momento.
El uso básico es así:
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)
No tengo una comprensión profunda de lo que sucede tras bambalinas, pero por lo que he visto hasta ahora en mi uso personal, este paquete tiene otras ventajas sobre RODBC
:
- realmente mas rapido
- obtenga los tipos de columna de la base de datos en lugar de adivinarlos (consulte here )
- no
stringsAsFactors
yas.is
argumentos necesarios
Intente cerrar su "consulta de tabulación" en SQL Server Management Studio Luego aparecerá una ventana emergente,
Esta consulta se está ejecutando actualmente. ¿Quieres cancelar esta consulta?
Cancelar de todos modos, elija "sí".
La mayoría de los usuarios de SQL Server utilizan SQL Server Management Studio (que es gratuito y se puede descargar de Microsoft) para conectarse a SQL Server o ejecutar comandos desde la línea de comandos a través de una herramienta llamada SQLCMD.
Si puede determinar el ID de sesión en el que se está ejecutando el Comando SQL, puede cancelar la sesión, lo que detendría cualquier comando (s) en ejecución. SQL Server aún necesitará tiempo (podría ser un tiempo ''largo'') para revertir cualquier cambio realizado durante la ejecución del comando.
La finalización de una sesión (según el software) puede tardar un tiempo en comunicar a SQL Server que la sesión ha finalizado. Cuando me conecté a DB2 desde SQL Server utilizando servidores vinculados, DB2 almacenaría en búfer el comando de terminación y con frecuencia tomaría hasta una hora para que DB2 se diera cuenta de que la sesión había finalizado.
Para determinar en qué sesión se está ejecutando puede probar:
select @@spid;
una vez que tenga el spid (digamos 86) puede emitir (dependiendo de si tiene permiso para hacerlo)
kill 86;
pero como Microsoft observa: finaliza un proceso de usuario que se basa en el ID de sesión o la unidad de trabajo (UOW). Si el ID de sesión o el UOW especificados tienen mucho trabajo por deshacer, la instrucción KILL puede tardar algún tiempo en completarse, especialmente cuando implica deshacer una transacción larga.
intente establecer su conexión antes de la consulta:
sql = odbcConnect(''Database name'')
Luego use la misma línea para ejecutar su consulta:
mydf <- sqlQuery(sql, " myquery ")
Nota: El tiempo de ejecución depende de la base de datos y del servidor R, pero la configuración de la conexión de esta manera debería resolver el problema de terminación.