Cuando utilizo SQL Server y hay un error, el mensaje de error da un número de línea que no tiene correlación con los números de línea en el procedimiento almacenado. Supongo que la diferencia se debe a los espacios en blanco y los comentarios, pero ¿es realmente así?
¿Cómo puedo relacionar estos dos conjuntos de números de línea entre sí? Si alguien pudiera darme al menos un indicador en la dirección correcta, realmente lo agradecería.
Estoy usando SQL Server 2005.
sql
sql-server-2005
chama
fuente
fuente
create proc
línea en mi prueba. Supongo que estás viendo algo diferente.Respuestas:
IIRC, comienza a contar líneas desde el inicio del lote que creó ese proceso. Eso significa el inicio del script o la última instrucción "GO" antes de la instrucción create / alter proc.
Una forma más sencilla de verlo es extraer el texto real que utilizó SQL Server al crear el objeto. Cambie su salida al modo de texto (CTRL-T con las asignaciones de teclas predeterminadas) y ejecute
Copie y pegue los resultados en una ventana de secuencia de comandos para resaltar la sintaxis, etc., y use la función ir a la línea (CTRL-G, creo) para ir a la línea de error informada.
fuente
Por costumbre, coloco
LINENO 0
directamente despuésBEGIN
en mis procedimientos almacenados. Esto restablece el número de línea, a cero, en este caso. Luego, simplemente agregue el número de línea informado por el mensaje de error al número de línea en SSMS donde escribióLINENO 0
y bingo; tiene el número de línea del error como se representa en la ventana de consulta.fuente
Si usa un bloque de captura y utilizó un RAISERROR () para cualquier validación de código dentro del bloque de prueba, la línea de error se informa donde está el bloque de captura y no donde ocurrió el error real. Lo usé así para aclarar eso.
fuente
En realidad esto
Error_number()
funciona muy bien.Esta función comienza los recuentos desde la última instrucción GO (Separador de lotes), por lo que si no ha utilizado ningún espacio Go y todavía muestra un número de línea incorrecto, agregue 7, como en el procedimiento almacenado en la línea número 7, el separador de lotes se utiliza automáticamente. Por lo tanto, si utiliza Cast (Error_Number () + 7 como Int) como [Error_Number], obtendrá la respuesta deseada.
fuente
if you have not used any Go spaces and it is still showing a wrong line number - then add 7 to it, as in stored procedure in line number 7 the batch separator is used automatically.
- ¿Qué se suponía que significaba esto?En TSQL / Procedimientos almacenados
Puede recibir un error como:
Esto significa que el error está en la línea 177 del lote. No 177 en el SQL. Debería ver en qué número de línea comienza su lote, en mi caso [7], y luego agrega ese valor al número de línea para encontrar qué declaración es incorrecta
fuente
puedes usar esto
y si desea hacer una tabla de registro de errores, puede usar esto:
fuente
La respuesta larga: el número de línea se cuenta a partir de la
CREATE PROCEDURE
declaración, más cualquier línea en blanco o línea de comentario que pueda haber tenido arriba cuando realmente ejecutó laCREATE
declaración, pero sin contar las líneas antes de unaGO
declaración ...Me pareció mucho más fácil hacer un proceso almacenado para jugar y confirmar:
Una vez que lo haya creado, puede cambiarlo
ALTER PROCEDURE
y agregar algunas líneas en blanco encima de los comentarios y arriba y debajo de la primeraGO
declaración para ver el efecto.Una cosa muy extraña que noté fue que tenía que correr
EXEC ErrorTesting
en una nueva ventana de consulta en lugar de resaltarla en la parte inferior de la misma ventana y ejecutar… ¡Cuando hice eso, los números de línea siguieron aumentando! No estoy seguro de por qué sucedió eso ...fuente
puede obtener un mensaje de error y una línea de error en el bloque de captura como este:
fuente