2010-12-07 1 views
11

log4net 스타일 디버그 정보를 저장 프로 시저 집합에 추가 할 수있는 가장 가까운 것은 무엇입니까? 일부 프로 시저는 다른 프로 시저로 작업을 위임하고 두 프로의 추적 정보를 원합니다.Sql Server (2008) 저장 프로 시저 추적/디버그 출력을 추가하는 방법

나는 인쇄 및 선택 진술을 개발하는 동안 뿌렸으며 정상적인 문제 해결 작업인지 여부에 따라 다른 모드에서 실행하고 더 많거나 적은 출력을 얻는 것이 이상적입니다.

이 경우 특정 저장 프로 시저는 에이전트 작업에서 반복적으로 실행되지만 문제 해결시 관리 스튜디오에서 실행할 수 있습니다.

procs는 이미 오류 로그 테이블과 전자 메일 기능을 사용하여 오류를 잡았습니다. 내가 추적 할 수있는 것으로 보이는 것은 입력 데이터 문제가 출력 데이터가 잘못되었음을 의미하지만 procs는 완전히 실패하지 않으며 각 단계에서 수행 된 작업을 정확히 보는 것이 유용 할 것입니다.

의미 있고 이상적으로 필터링 가능한 출력을 산출하기위한 접근 방법은 무엇입니까? 답변을 당

하나 그래서 우리는 최종 순위 ;-)과 같은 답변을 환영 박스의 아웃

볼 수 있습니다 -

+0

어쩌면이 SO 데 도움을 http://stackoverflow.com/questions/3829201/sql-select-print-out-results-of-stored-procedue/3832356 # 3832356 – adopilot

답변

13

말뚝

예를 들어

print 'Doing something...' 
INSERT INTO foo(a) VALUES(1) 
print @@ROWCOUNT 

단지 균형이 답변, 그것은 여기 조용한 라운드의로보고.

+1

토글을 쉽게하기 위해 내 대답에'[dbo]. [PrintMessage]'접근 방식을 선호한다. 꺼져. –

+0

나는 인기있는 대답을 계속 유지하기 위해 대중의 의견에 동의한다. –

+0

@TimAbell이 print 문 출력은 문제 해결을 위해 SQL Server의 어느 곳에서나 계속됩니까? – Antoops

7

한 "하지 않는 관리 Studio를 통해 단계 당신이 필요로 할 때까지" 접근 방식은 SSMS에서 실행중인 proc가 있는지 확인하고 일부 경우 Custom user configurable SQL Server Profiler events을 실행하는 것입니다. 예 :

CREATE PROC foo 
AS 
DECLARE @debug bit = CASE WHEN APP_NAME() = 'Microsoft SQL Server Management Studio - Query' 
          THEN 1 
          ELSE 0 END 

DECLARE @userinfo nvarchar(128) 
DECLARE @userdata varbinary(8000) 

--Do some work here 

IF @debug = 1 
BEGIN 
--Do some custom logging 
    SET @userinfo = N'Some custom info' 
    SET @userdata = CAST('Some custom data' AS varbinary(8000)) 
    EXEC sp_trace_generateevent @eventid = 82 /*Use 82-91*/ 
           ,@userinfo = @userinfo 
           ,@userdata = @userdata 

END 

비록 실제로 나는 일반적으로 다음과 같이 사용합니다. 때로는 요구 사항에 따라 메시지 (및 단계 및 상태 값)를 테이블에 기록하는 추가 코드가 필요합니다. 이렇게하면 "필터링 가능한"요구 사항을 충족 할 수 있습니다.

APP_NAME이 (영어 버전의) SSMS에서 실행 중임을 나타내며 NOWAIT을 사용하는 경우를 제외하고는 메시지가 인쇄되는 것을 중지합니다. 따라서 메시지는 버퍼가 채워지기를 기다리지 않고 즉시 인쇄됩니다. 인쇄 문

CREATE PROCEDURE [dbo].[PrintMessage] @message   NVARCHAR(MAX), 
             @PrependCurrentTime BIT = 0 
AS 
    IF APP_NAME() LIKE 'Microsoft SQL Server Management Studio%' 
     BEGIN 
      DECLARE @CurrentTimeString VARCHAR(30); 

      SET @CurrentTimeString = '' 

      IF @PrependCurrentTime = 1 
      BEGIN 
       SET @CurrentTimeString = CONVERT(VARCHAR(19), GETDATE(), 20) + ' ' 
      END 

      RAISERROR('%s%s',0,1,@CurrentTimeString,@message) WITH NOWAIT 

     END 
+0

http://msdn.microsoft.com/en-us/library/ms177548.aspx msdn ref –

+1

nb. 프로덕션 환경에서 사용할 수없는 특정 권한이 필요합니다! (어려운 방법을 발견 했으니 까.) –

+0

두 번째 부분을 자체 답변으로 나눌 가치가있다. –

1

추적 출력을 추가하지 말고, 필요에 따라 SQL Server 관리 Studio 디버거를 단계별로 실행하십시오.

(사람들이 선호 있는지 확인하기 위해 추가)