none
T-SQL→イベントログ出力方法 RRS feed

  • 質問

  • お世話になります。

    あるT-SQLを1日1回定期実行し、その結果を1行ごとにイベントログに出力したいと思います。

    eventcreateコマンドとSQLCMDコマンドを使ってそのT-SQLを呼び出した結果をイベントログに書き込もうかと思いましたが、
    SQLCMDで出力した結果全てがイベントログに書き込まれてしまいます。(カラム名含め)
    また、上記方法を使用しようと思いましたが、結果が0行を返してきた場合でもイベントログに書き込まれてしまうのではないかと思い、現在は断念しております。

    1行ごとにイベントログに出力する何かいい方法ございませんでしょうか。

    いろいろと調べてみましたが、T-SQLの出力結果をイベントログに書き出すというものが見つからず、苦悩しております。

    よろしくお願い致します。
    2011年2月8日 0:29

回答

  • お世話になります。

    あるT-SQLを1日1回定期実行し、その結果を1行ごとにイベントログに出力したいと思います。

    eventcreateコマンドとSQLCMDコマンドを使ってそのT-SQLを呼び出した結果をイベントログに書き込もうかと思いましたが、
    SQLCMDで出力した結果全てがイベントログに書き込まれてしまいます。(カラム名含め)
    また、上記方法を使用しようと思いましたが、結果が0行を返してきた場合でもイベントログに書き込まれてしまうのではないかと思い、現在は断念しております。

    1行ごとにイベントログに出力する何かいい方法ございませんでしょうか。

    いろいろと調べてみましたが、T-SQLの出力結果をイベントログに書き出すというものが見つからず、苦悩しております。

    よろしくお願い致します。

    SQLCLRのようなVBやC#でDLLを作成して、SQLSERVERにFunctionを作成する。

    Windowsイベントログの処理をSQLCLRのDLLに書き込めばいいと思います。

    • 回答としてマーク 山本春海 2011年3月18日 8:56
    2011年2月28日 14:14
  • RAISERRORでWith Logオプションを指定すればできそうです。(未検証です)

    RAISERROR (Transact-SQL)

     


    Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/
    • 編集済み jhashimoto 2011年2月28日 19:46 リンクを追加
    • 回答としてマーク 山本春海 2011年3月18日 8:56
    2011年2月28日 19:43
  • RAISERRORでWith Logオプションを指定すればできそうです。(未検証です)

    RAISERROR (Transact-SQL)

     


    Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/

    RAISERRORは確かにエラーとしてログ出力するのですが、Windowイベントログのカテゴリでは、アプリケーションログもあります。

    出力したいログの種類によって、変わってきますね。

    また、リモートPCのWinodwsイベントログへの書き込みは無理でしょう。

      'Windows Systemイベントログ出力
      Function func_Winsystemlog(ByVal argStrmsg As String, _
                    ByVal argIntlog As Integer, _
                    Optional ByVal argEventid As Integer = 0) As Integer
    
        Dim cpt = strEventlogserver         ' コンピュータ名
        Dim log = strEventlogkat          ' イベント・ログ名
        Dim src = conOthApplicationname       ' イベント・ソース名
    
        'MsgBox(cpt)
        'MsgBox(log)
        'MsgBox(src)
    
        Try
          If Not EventLog.SourceExists(src, cpt) Then
            Dim data As New EventSourceCreationData(src, log)
            EventLog.CreateEventSource(data)
          End If
    
          Dim elog As New EventLog(log, cpt, src)
    
          'strMsg組み合わせ
          If strObjectname <> "" Then
            If strFbrno.ToString <> "" Then
              argStrmsg = "(" & strObjectname & ")" & _
                    "(" & strFbrno.ToString & ")" & _
                    conOthApplicationname & _
                    Space(1) & _
                    argStrmsg
            Else
              argStrmsg = "(" & strObjectname & ")" & _
                    conOthApplicationname & _
                    Space(1) & _
                    argStrmsg
            End If
          End If
    
          Select Case argIntlog
            Case 1
              ' Write an 'Error' entry in specified log of event log.
              elog.WriteEntry(argStrmsg, EventLogEntryType.Error, argEventid)
            Case 2
              ' Write a 'Warning' entry in specified log of event log.
              elog.WriteEntry(argStrmsg, EventLogEntryType.Warning, argEventid)
            Case 4
              ' Write an 'Information' entry in specified log of event log.
              elog.WriteEntry(argStrmsg, EventLogEntryType.Information, argEventid)
            Case 16
              ' Write a 'FailureAudit' entry in specified log of event log.
              elog.WriteEntry(argStrmsg, EventLogEntryType.FailureAudit, argEventid)
            Case 8
              ' Write a 'SuccessAudit' entry in specified log of event log.
              elog.WriteEntry(argStrmsg, EventLogEntryType.SuccessAudit, argEventid)
            Case Else
              Exit Function
          End Select
    
        Catch ex As Exception
          If ex.InnerException Is Nothing Then
            strMsg = "InnerException:Nothing" & Space(1) & "Message:" & ex.Message
          Else
            strMsg = "InnerException:" & ex.InnerException.ToString & Space(1) & "Message:" & ex.Message
          End If
          'MsgBox(strMsg)
          Return conEVENT149
        End Try
    
        Return 0
      End Function
    • 回答としてマーク 山本春海 2011年3月18日 8:56
    2011年3月1日 2:44

すべての返信

  • お世話になります。

    あるT-SQLを1日1回定期実行し、その結果を1行ごとにイベントログに出力したいと思います。

    eventcreateコマンドとSQLCMDコマンドを使ってそのT-SQLを呼び出した結果をイベントログに書き込もうかと思いましたが、
    SQLCMDで出力した結果全てがイベントログに書き込まれてしまいます。(カラム名含め)
    また、上記方法を使用しようと思いましたが、結果が0行を返してきた場合でもイベントログに書き込まれてしまうのではないかと思い、現在は断念しております。

    1行ごとにイベントログに出力する何かいい方法ございませんでしょうか。

    いろいろと調べてみましたが、T-SQLの出力結果をイベントログに書き出すというものが見つからず、苦悩しております。

    よろしくお願い致します。

    SQLCLRのようなVBやC#でDLLを作成して、SQLSERVERにFunctionを作成する。

    Windowsイベントログの処理をSQLCLRのDLLに書き込めばいいと思います。

    • 回答としてマーク 山本春海 2011年3月18日 8:56
    2011年2月28日 14:14
  • RAISERRORでWith Logオプションを指定すればできそうです。(未検証です)

    RAISERROR (Transact-SQL)

     


    Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/
    • 編集済み jhashimoto 2011年2月28日 19:46 リンクを追加
    • 回答としてマーク 山本春海 2011年3月18日 8:56
    2011年2月28日 19:43
  • RAISERRORでWith Logオプションを指定すればできそうです。(未検証です)

    RAISERROR (Transact-SQL)

     


    Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/

    RAISERRORは確かにエラーとしてログ出力するのですが、Windowイベントログのカテゴリでは、アプリケーションログもあります。

    出力したいログの種類によって、変わってきますね。

    また、リモートPCのWinodwsイベントログへの書き込みは無理でしょう。

      'Windows Systemイベントログ出力
      Function func_Winsystemlog(ByVal argStrmsg As String, _
                    ByVal argIntlog As Integer, _
                    Optional ByVal argEventid As Integer = 0) As Integer
    
        Dim cpt = strEventlogserver         ' コンピュータ名
        Dim log = strEventlogkat          ' イベント・ログ名
        Dim src = conOthApplicationname       ' イベント・ソース名
    
        'MsgBox(cpt)
        'MsgBox(log)
        'MsgBox(src)
    
        Try
          If Not EventLog.SourceExists(src, cpt) Then
            Dim data As New EventSourceCreationData(src, log)
            EventLog.CreateEventSource(data)
          End If
    
          Dim elog As New EventLog(log, cpt, src)
    
          'strMsg組み合わせ
          If strObjectname <> "" Then
            If strFbrno.ToString <> "" Then
              argStrmsg = "(" & strObjectname & ")" & _
                    "(" & strFbrno.ToString & ")" & _
                    conOthApplicationname & _
                    Space(1) & _
                    argStrmsg
            Else
              argStrmsg = "(" & strObjectname & ")" & _
                    conOthApplicationname & _
                    Space(1) & _
                    argStrmsg
            End If
          End If
    
          Select Case argIntlog
            Case 1
              ' Write an 'Error' entry in specified log of event log.
              elog.WriteEntry(argStrmsg, EventLogEntryType.Error, argEventid)
            Case 2
              ' Write a 'Warning' entry in specified log of event log.
              elog.WriteEntry(argStrmsg, EventLogEntryType.Warning, argEventid)
            Case 4
              ' Write an 'Information' entry in specified log of event log.
              elog.WriteEntry(argStrmsg, EventLogEntryType.Information, argEventid)
            Case 16
              ' Write a 'FailureAudit' entry in specified log of event log.
              elog.WriteEntry(argStrmsg, EventLogEntryType.FailureAudit, argEventid)
            Case 8
              ' Write a 'SuccessAudit' entry in specified log of event log.
              elog.WriteEntry(argStrmsg, EventLogEntryType.SuccessAudit, argEventid)
            Case Else
              Exit Function
          End Select
    
        Catch ex As Exception
          If ex.InnerException Is Nothing Then
            strMsg = "InnerException:Nothing" & Space(1) & "Message:" & ex.Message
          Else
            strMsg = "InnerException:" & ex.InnerException.ToString & Space(1) & "Message:" & ex.Message
          End If
          'MsgBox(strMsg)
          Return conEVENT149
        End Try
    
        Return 0
      End Function
    • 回答としてマーク 山本春海 2011年3月18日 8:56
    2011年3月1日 2:44
  • RAISERRORでWith Logオプションを指定すればできそうです。(未検証です)

    RAISERROR (Transact-SQL)

     


    Blog:プログラマーな日々 http://d.hatena.ne.jp/JHashimoto/

    RAISERRORは確かにエラーとしてログ出力するのですが、Windowイベントログのカテゴリでは、アプリケーションログもあります。

    出力したいログの種類によって、変わってきますね。

    また、リモートPCのWinodwsイベントログへの書き込みは無理でしょう。

      'Windows Systemイベントログ出力
      Function func_Winsystemlog(ByVal argStrmsg As String, _
                    ByVal argIntlog As Integer, _
                    Optional ByVal argEventid As Integer = 0) As Integer
    
        Dim cpt = strEventlogserver         ' コンピュータ名
        Dim log = strEventlogkat          ' イベント・ログ名
        Dim src = conOthApplicationname       ' イベント・ソース名
    
        'MsgBox(cpt)
        'MsgBox(log)
        'MsgBox(src)
    
        Try
          If Not EventLog.SourceExists(src, cpt) Then
            Dim data As New EventSourceCreationData(src, log)
            EventLog.CreateEventSource(data)
          End If
    
          Dim elog As New EventLog(log, cpt, src)
    
          'strMsg組み合わせ
          If strObjectname <> "" Then
            If strFbrno.ToString <> "" Then
              argStrmsg = "(" & strObjectname & ")" & _
                    "(" & strFbrno.ToString & ")" & _
                    conOthApplicationname & _
                    Space(1) & _
                    argStrmsg
            Else
              argStrmsg = "(" & strObjectname & ")" & _
                    conOthApplicationname & _
                    Space(1) & _
                    argStrmsg
            End If
          End If
    
          Select Case argIntlog
            Case 1
              ' Write an 'Error' entry in specified log of event log.
              elog.WriteEntry(argStrmsg, EventLogEntryType.Error, argEventid)
            Case 2
              ' Write a 'Warning' entry in specified log of event log.
              elog.WriteEntry(argStrmsg, EventLogEntryType.Warning, argEventid)
            Case 4
              ' Write an 'Information' entry in specified log of event log.
              elog.WriteEntry(argStrmsg, EventLogEntryType.Information, argEventid)
            Case 16
              ' Write a 'FailureAudit' entry in specified log of event log.
              elog.WriteEntry(argStrmsg, EventLogEntryType.FailureAudit, argEventid)
            Case 8
              ' Write a 'SuccessAudit' entry in specified log of event log.
              elog.WriteEntry(argStrmsg, EventLogEntryType.SuccessAudit, argEventid)
            Case Else
              Exit Function
          End Select
    
        Catch ex As Exception
          If ex.InnerException Is Nothing Then
            strMsg = "InnerException:Nothing" & Space(1) & "Message:" & ex.Message
          Else
            strMsg = "InnerException:" & ex.InnerException.ToString & Space(1) & "Message:" & ex.Message
          End If
          'MsgBox(strMsg)
          Return conEVENT149
        End Try
    
        Return 0
      End Function
    

    set @@streventmsg = N'TEST'
    exec xp_logevent 60000,@@streventmsg,error
    2013年11月5日 7:02