es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

SQL Server se bloquea al INSERTAR/SELECCIONAR cuando las columnas no coinciden… pero solo en SQL Server Management Studio

Pregunta

Recientemente logré bloquear nuestra base de datos de SQL Server con una consulta como esta (simplificada para mayor claridad):

SELECT *, NULL AS extraColmn
INTO #tempTable
FROM sourceTable</p>

<p>IF @@ROWCOUNT > 0
BEGIN
    BEGIN TRANSACTION;</p>

<pre><code>DELETE FROM sourceTable

INSERT INTO sourceTable
SELECT * FROM #tempTable;

COMMIT TRANSACTION;

DROP TABLE #tempTable
</code></pre>

<p>END

Hay dos problemas evidentes con esto. Primero, la declaración INSERT/SELECT debe tener las columnas explícitamente listadas. Segundo, al hacer esa inserción, las tablas de origen y destino tenían una cantidad diferente de columnas. Como era de esperar, esto causó un error:

Msg 213, Level 16, State 1, Line 1
Column name or number of supplied values does not match table definition.

Y la consulta simplemente falló en nuestro servidor de producción.

Pero extrañamente, cuando ejecuté esta misma consulta en SQL Server Management Studio, apareció ese error, pero luego se bloqueó toda la base de datos, al punto en el que tuve que reiniciar el servidor de la base de datos.

¿Por qué? ¿Es la transacción? Soy un novato en eso, pero entendí que si se encuentra un error en una transacción, simplemente se deshace, ese es el punto. (Tenga en cuenta que sourceTable se utiliza bastante en este sitio, por lo que probablemente habría habido algunos intentos concurrentes de acceder a ella mientras esto se ejecutaba.)

¿Por qué esto solo ocurre en SQL Server Management Studio?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Es posible que la consulta se estuviera ejecutando en una transacción implícita, lo que explicaría por qué se bloqueó toda la base de datos. Una transacción implícita se inicia cuando se ejecuta una consulta sin iniciar explícitamente una transacción. Esto puede suceder al ejecutar una consulta en SQL Server Management Studio, ya que automáticamente iniciará una transacción si no existe ninguna en progreso. Esto podría explicar por qué la consulta estaba bloqueando toda la base de datos. Para evitar este problema, es recomendable iniciar explícitamente una transacción antes de ejecutar cualquier consulta.

Comments are closed.