Kiedy używam SQL Server i pojawia się błąd, komunikat o błędzie podaje numer wiersza, który nie ma korelacji z numerami wierszy w procedurze składowanej. Zakładam, że różnica wynika z białych znaków i komentarzy, ale czy rzeczywiście?
Jak mogę powiązać te dwa zestawy numerów wierszy ze sobą? Gdyby ktokolwiek mógł mi przynajmniej wskazać właściwy kierunek, byłbym naprawdę wdzięczny.
Używam SQL Server 2005.
sql
sql-server-2005
chama
źródło
źródło
create proc
linii w moim teście. Zakładam, że widzisz coś innego.Odpowiedzi:
IIRC, zaczyna liczyć wiersze od początku partii, która utworzyła ten proc. Oznacza to albo początek skryptu, albo ostatnią instrukcję „GO” przed instrukcją create / alter proc.
Łatwiejszym sposobem sprawdzenia tego jest pobranie rzeczywistego tekstu, którego SQL Server użył podczas tworzenia obiektu. Przełącz wyjście w tryb tekstowy (CTRL-T z domyślnymi mapowaniami klawiszy) i uruchom
Skopiuj, wklej wyniki do okna skryptu, aby uzyskać podświetlanie składni itp., I użyj funkcji linii goto (myślę, że CTRL-G), aby przejść do zgłoszonego wiersza błędu.
źródło
Z przyzwyczajenia umieszczam
LINENO 0
bezpośrednio poBEGIN
w moich procedurach składowanych. Spowoduje to zresetowanie numeru linii - w tym przypadku do zera. Następnie po prostu dodaj numer linii zgłoszony przez komunikat o błędzie do numeru linii w SSMS, w którym napisałeśLINENO 0
i bingo - masz numer linii błędu przedstawiony w oknie zapytania.źródło
Jeśli użyjesz Catch Block i użyjesz RAISERROR () do walidacji dowolnego kodu w Try Block, wówczas wiersz błędu zostanie zgłoszony tam, gdzie znajduje się Catch Block, a nie tam, gdzie wystąpił rzeczywisty błąd. Użyłem tego w ten sposób, aby to wyjaśnić.
źródło
Właściwie to
Error_number()
działa bardzo dobrze.Ta funkcja zaczyna zliczać od ostatniej instrukcji GO (Batch Separator), więc jeśli nie użyłeś żadnych spacji Go i nadal wyświetla nieprawidłowy numer wiersza - dodaj do niego 7, tak jak w procedurze składowanej w linii numer 7 separator wsadu jest używany automatycznie. Więc jeśli użyjesz select Cast (Error_Number () + 7 as Int) jako [Error_Number] - otrzymasz pożądaną odpowiedź.
źródło
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.
- co to miało znaczyć?W TSQL / procedurach składowanych
Możesz otrzymać błąd, taki jak:
Oznacza to, że błąd występuje w linii 177 w partii. Nie 177 w SQL. Powinieneś zobaczyć, od jakiego numeru linii zaczyna się twoja partia, w moim przypadku [7], a następnie dodajesz tę wartość do numeru linii, aby dowiedzieć się, która instrukcja jest błędna
źródło
możesz tego użyć
a jeśli chcesz utworzyć tabelę dziennika błędów, możesz użyć tego:
źródło
Długa odpowiedź: numer wiersza jest liczony na podstawie
CREATE PROCEDURE
instrukcji plus wszelkie puste wiersze lub wiersze komentarza, które mogły znajdować się nad nim, gdy faktycznie wykonywałeśCREATE
instrukcję, ale nie licząc żadnych wierszy przedGO
instrukcją…O wiele łatwiej było stworzyć przechowywany proces, aby się nim bawić, aby potwierdzić:
Po utworzeniu możesz go przełączyć na
ALTER PROCEDURE
i dodać puste wiersze nad komentarzami oraz nad i pod pierwszymGO
instrukcji, aby zobaczyć efekt.Jedną bardzo dziwną rzeczą, którą zauważyłem, było to, że musiałem uruchomić
EXEC ErrorTesting
w nowym oknie zapytania zamiast podświetlać je na dole tego samego okna i uruchamiać… Kiedy to zrobiłem, numery linii ciągle rosły! Nie wiem, dlaczego tak się stało ...źródło
możesz otrzymać komunikat o błędzie i wiersz błędu w bloku catch w ten sposób:
źródło