views:

138

answers:

2

If you have a long running SP, do you log somehow it's actions or just wait for this message?

"Command(s) completed successfully."

I assume, that there can be plenty solutions on this subject, but is there any best practice - a simple solution that is frequently used?

EDIT

I've found an interesting link on this subject

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

Article describes using a log table, but there's an issue

The logging procedure must be executed outside of any transaction

I can't call that insert outside, because of cursor that I use and insert a line to that table on every row.

Any ideas?

EDIT 2

Digging..

there's a xp_logevent in SQL Server. Did you try it?

What about SQL Server Profiler?

There's also Creating Log file for Stored Procedure

+1  A: 

We generally use logging tables and take care around transactions. We pretty much avoid anything that involves going outside of SQL Server (e.g. writing to filesystem, calling external services, .NET assemblies, etc.)

We also try to avoid cursors -- is it possible your proc is long running because it's inefficient?

Joe
Can you be more specific?What if you can't insert to your log table outside a transaction? I know, that cursors are not recommended, but it's one time used script and there's no other way, so this is a case when cursors are necessary.
hgulyan
+3  A: 

How are you invoking the stored procedure? If it is through Management Studio then you can easily print out the message as follows

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

This is preferable to using PRINT as the message will appear immediately. These messages can also be caught in ADO.NET by wiring up a handler for the Connection.InfoMessage event.

I see that you have already listed SQL Profiler as a possibility. You might be interested to know that you can log your own user configurable events that can be seen in SQL Profiler.

Martin Smith
I'm invoking sp in management studio, but the question is general, so if there's a nice way of logging, it can be used in application also.I don't need RAISERROR, because I need to log process, not errors. PRINT can be an option, but what if sp prints like 1000 rows per second?I've already tried SQL Profiler. It's a nice option, but it's not really a logging. It's more monitoring, I suppose and profiler isn't a general solution. Maybe solution is combining all that was told here.
hgulyan
Don't be confused by the name RAISERROR is not just for errors. Anything with severity of less than 10 is just for info messages. Clearly whatever logging framework you use you need to design it such that an appropriate amount of information is being logged.
Martin Smith
Won't Raiserror stop the sp?p.s. and thank you for custom user configuration in profiler. thanks most interesting link on this topic.
hgulyan
No. It won't stop the SP because the severity level is low. For details see http://msdn.microsoft.com/en-us/library/ms178592.aspx
Martin Smith
Ok, I got it, but what's the difference between raiserror and a simple print if it's only for info messages?
hgulyan
With `Print` you won't get the message back till the stored procedure ends (I think - Or at the very least you'll have to wait for it) `RAISERROR ... WITH NOWAIT` avoids that issue. Infact according to this link. A print statement *is* just "a message on severity level 0." http://www.sommarskog.se/error-handling-I.html
Martin Smith
The print output is buffered, and so you won't see the results right away and they can come out of order with the error stream, which is buffered separately. Since raiserror uses the separate buffer which can force to flush on each statement (the `WITH NOWAIT` directive), it's better for most logging purposes.
Joel Coehoorn
Thank you Martin and Joel:)
hgulyan
@Martin Smith, After our conversation, I read your answer for the second time, and it's absolutely right and simple answer.
hgulyan