2009-08-12 7 views
19

Reference: SQL ServerJak używać instrukcji PRINT do śledzenia wykonania, ponieważ działa procedura przechowywana?

Mam procedurę przechowywaną z pętlą while i chcę, aby niektóre wiadomości były drukowane po każdych 500 pętli.

Więc pisałem -

CREATE spxxx 
AS 
BEGIN 
    BEGIN TRAN 
     DECLARE @counter = 0; 

     WHILE <somecondition> 
      SET @counter = @counter + 1; 

      IF @counter % 50 = 0 
      BEGIN 
       PRINT @counter; 
      END 
     END 
    COMMIT TRAN 
END -- End spxxx 

Ale drukuje wszystkie wiadomości po zakończeniu proc. Chcę, żeby wydrukował wiadomości podczas działania.

+0

Przepraszam, że był typ, potrzebuję wiadomości co 50 pętli. – Storm

Odpowiedz

26

Jestem pewien, że można użyć RAISERROR ... WITH NOWAIT

Jeśli używasz surowość 10 to nie jest błąd. Zapewnia to również wygodne formatowanie, np.% S,% i, możesz także użyć stanu, aby śledzić, gdzie jesteś.

+0

HI, dziękuję, ale próbowałem RAISERROR (@msg, 10, 1) z nowait; i nadal nic nie :( – Storm

+2

Spróbuj wydrukować następujący kod: Declare @counter INT \t SET @counter = 0; \t DECLARE @msg VARCHAR (4) PODCZAS @counter <1000 \t POCZĄTEK SET @counter = @counter + 1; IF @counter% 50 = 0 \t \t UŻYCIEM \t \t \t SET @msg = węglowej (@counter jak VARCHAR (4)) RAISERRO R (@msg, 10, 0) z nowait \t \t \t waitfor DELAY '00: 00: 01' \t \t END END –

+2

nopes. wciąż nie działa ! – Storm

2

Serwer SQL zwraca komunikaty po wykonaniu partii instrukcji. Normalnie, można użyć SQL GO aby wskazać koniec partii i pobrać wyniki:

PRINT '1' 
GO 

WAITFOR DELAY '00:00:05' 

PRINT '2' 
GO 

WAITFOR DELAY '00:00:05' 

PRINT '3' 
GO 

W tym przypadku jednak, że instrukcja print chcesz niezwłocznie zwrócone jest w środku pętli, więc instrukcje drukowania nie mogą być we własnej partii. Jedyną komendą, którą znam, która powróci w środku wsadu, jest RAISERROR (...) WITH NOWAIT, które jako odpowiedź wpisałem jako odpowiedź gbn.

+0

: To nie działa wewnątrz SP, ale jest to oczywiste w Query Window.Is to? – kta

0

Czy mogę po prostu zapytać o długoterminową potrzebę tego obiektu - czy jest to do celów debugowania?

Jeśli tak, to możesz rozważyć użycie odpowiedniego debuggera, takiego jak ten znaleziony w Visual Studio, ponieważ pozwala ci to przejść przez procedurę w bardziej kontrolowany sposób i unika konieczności ciągłego dodawania/usuwania DRUKUJ instrukcję z procedury.

Po prostu moja opinia, ale ja wolę podejście debuggera - dla kodu i baz danych.

+1

Nie potrzebuję długofalowo, właśnie napisałem SP o migracji danych i chciałem zobaczyć wyniki w pętli. – Storm

+1

Znalazłem przydatne do diagnozowania problemów z wydajnością, dodając czasy w różnych miejscach. Jeśli zostanie to zrobione przy użyciu debuggera, proces debugowania może wpłynąć na mierzony SP. –

Powiązane problemy