2010-05-30 15 views
20

Jeśli masz SP z długim biegiem, czy logujesz się w jakiś sposób do jego akcji lub po prostu czekasz na tę wiadomość?Sprawdzone metody - Rejestrowanie zapisanych procedur

"Komendy zakończono pomyślnie."

Zakładam, że może istnieć wiele rozwiązań na ten temat, ale czy istnieje jakaś najlepsza praktyka - proste rozwiązanie, które jest często używane?

EDIT

Znalazłem ciekawy link na ten temat

http://weblogs.sqlteam.com/brettk/archive/2006/09/21/12391.aspx

artykule opisano przy użyciu tabeli dziennika, ale jest to kwestia

Procedurę rejestrowania musi być wykonany poza jakąkolwiek transakcją

Nie mogę wywołać tej wstawki na zewnątrz, ponieważ używam kursora i wstawiam wiersz do tej tabeli w każdym wierszu.

Wszelkie pomysły?

EDIT 2

Kopanie ..

istnieje xp_logevent w SQL Server. Spróbowałeś?

Co z programem SQL Server Profiler?

Jest też Creating Log file for Stored Procedure

+0

zdefiniować długotrwałe? –

+0

Każdy sp, to więcej niż kilka wybranych i aktualizacji. Na przykład, jeśli używasz kursora i musisz oglądać postęp. Czy coś jest nie tak z moim pytaniem? – hgulyan

Odpowiedz

22

W jaki sposób wywołuje procedura przechowywana? Jeśli jest za pośrednictwem Management Studio następnie można łatwo wydrukować wiadomość następująco

RAISERROR ('Some debugging info', 0, 1) WITH NOWAIT 

Jest to korzystniejsze PRINT jako komunikat pojawi się natychmiast. Te komunikaty mogą również zostać przechwycone w ADO.NET przez podłączenie obsługi do zdarzenia Connection.InfoMessage.

Widzę, że masz już listę programu SQL Profiler jako możliwość. Być może zainteresuje Cię to, że możesz log your own user configurable events, które można zobaczyć w programie SQL Profiler.

+1

Wzywam sp w studio zarządzania, ale pytanie jest ogólne, więc jeśli istnieje dobry sposób logowania, można go również wykorzystać w aplikacji. Nie potrzebuję RAISERROR, ponieważ potrzebuję logować proces, a nie błędy. PRINT może być opcją, ale co, jeśli sp drukuje jak 1000 wierszy na sekundę? Próbowałem już programu SQL Profiler. To dobra opcja, ale tak naprawdę nie jest to rejestracja. Przypuszczam, że to więcej monitoringu, a profiler nie jest rozwiązaniem ogólnym. Może rozwiązanie łączy wszystko, co tu powiedziano. – hgulyan

+1

Nie mylić nazwy RAISERROR nie tylko dla błędów. Wszystko o sile mniejszej niż 10 jest tylko dla wiadomości informacyjnych. Bez względu na to, z jakiej struktury logowania korzystasz, musisz zaprojektować ją tak, aby rejestrować odpowiednią ilość informacji. –

+0

Czy Raiserror nie zatrzyma sp? p.s. i dziękuję za niestandardową konfigurację użytkownika w profiler. dziękuje za najbardziej interesujący link na ten temat. – hgulyan

3

Ogólny używamy tabel rejestrowania i dbać wokół transakcji. W zasadzie unikamy wszystkiego, co wymaga wychodzenia poza SQL Server (np. Zapisywanie do systemu plików, wywoływanie usług zewnętrznych, zespołów .NET, itp.).

Staramy się również unikać kursorów - czy to możliwe, że Twój proces jest długi, ponieważ to nieefektywne?

+0

Czy możesz być bardziej konkretny? Co zrobić, jeśli nie można wstawić do tabeli dziennika poza transakcją? Wiem, że kursory nie są zalecane, ale jest to jeden z używanych skryptów i nie ma innego sposobu, więc jest to przypadek, gdy kursory są konieczne. – hgulyan

7

Aby sprawdzić, ile czasu trwa proces i ile wierszy zostało zmodyfikowanych w poprzedniej czynności, dodam bieżącą datę + czas i ostatnią liczbę wierszy do każdego wpisu.Używam tej procedury:

CREATE PROCEDURE dbo.[Log] 
    @Message NVARCHAR(512), 
    @RowCount INT = null OUTPUT, 
    @Delimiter NCHAR(1) = N' ', 
    @PadChar NCHAR(1) = N'-' 
AS 
    BEGIN 
     SET @RowCount = @@ROWCOUNT; 

     DECLARE @LogDate AS NVARCHAR(50); 
     DECLARE @RowCountPadded AS NCHAR(8); 

     SET @LogDate = CONVERT(NVARCHAR(50),GETDATE(),121); 
     SELECT @RowCountPadded = CASE @RowCount WHEN 0 THEN REPLICATE(@PadChar,8) ELSE REPLACE(STR(@RowCount, 8), SPACE(1), @PadChar) END; 

     SET @Message = @LogDate + @Delimiter + @RowCountPadded + @Delimiter + @Message; 
     RAISERROR (@Message, 0, 1) WITH NOWAIT; 
    END 

więc w swoich procedurach, dodać wyjście dziennika tak:

EXEC dbo.[Log] 'the message'; 

Produkuje to:

2012-12-28 11:28:25.197 -------- the message 

Gdybyś przeprowadzić pewne działania wcześniej, ty d widział liczbę wierszy, w której znajdują się kreski. Jeśli potrzebujesz liczby wierszy dla czegoś innego (np. Do zalogowania się do tabeli), możesz odzyskać ją z procedury jako parametr WYJŚCIA.

UPDATE: Użyj tej gist, jeśli chcesz utworzyć tę procedurę raz i używać jej wszędzie.

0

używam tej procedury

CREATE PROCEDURE dbo.PrintLog (
    @Msg VARCHAR(2048) 
    , @Option VARCHAR(100) = '' 
    , @Separator VARCHAR(10) = '-' 
    ) 
/* 
@Option is a string containing possible values as B,A,D,T 
if you want to print separator before message, include B 
if you want to print separator after message, include A 
if you want to print date, include D 
if you want to print time, include T 
Sample: 'BAD' 

The order of characters does not matter. it is not case sensitive 

Usage: 
    exec dbo.PrintLog 'Timed Log', 'T' 
    exec dbo.PrintLog 'Dated Log', 'D' 
    exec dbo.PrintLog 'With Separator and Time', 'BT', '><' 
    exec dbo.PrintLog 'With Separator and Date', 'BAD', '*' 
    exec dbo.PrintLog 'With Separator and DateTime', 'BADT', 'x' 
*/ 
AS 
BEGIN 
    declare @tempStr varchar(100) 
    set @tempStr = replicate(@Separator, 50) 
    IF charindex('B', upper(@Option)) > 0 
     raiserror (@tempStr, 10, 1) with nowait 

    DECLARE @prompt VARCHAR(max) = '' 

    IF charindex('D', upper(@Option)) > 0 
     SET @prompt = convert(VARCHAR, SysDatetime(), 101) + ' ' 

    IF charindex('T', upper(@Option)) > 0 
     SET @prompt = @prompt + convert(VARCHAR, SysDatetime(), 108) + ' ' 
    SET @prompt = @prompt + @Msg 

    raiserror (@prompt, 10, 1) with nowait 

    set @tempStr = replicate(@Separator, 50) 
    IF charindex('A', upper(@Option)) > 0 
     raiserror (@tempStr, 10, 1) with nowait 

    RETURN 
END 

GO 

Wykorzystanie

exec dbo.PrintLog 'Date and Timed Log', 'DT' 
    exec dbo.PrintLog 'Dated Log', 'D' 
    exec dbo.PrintLog 'With Separator and Time', 'BT', '><' 
    exec dbo.PrintLog 'With Separator and Date', 'BAD', '*' 
    exec dbo.PrintLog 'With Separator and DateTime', 'BADT', 'x' 

Można również zmienić domyślne ustawienia parametrów dla ciebie pożądane wartości.

Powiązane problemy