同じタイプのプロパティを持つクラスがあるとします(クラスについてはC#で説明しますが、ここでは関係ありません)
class Exception
{
public string Message { get; set; }
public string StackTrace { get; set; }
public Exception InnerException { get; set; }
}
上記のコードからわかるように、ネストされた例外を持つ例外クラスがあります。
これらの例外を格納するためのテーブルを作成しましょう
CREATE TABLE Exceptions
(
Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Message] NVARCHAR(MAX) NOT NULL,
StackTrace NVARCHAR(MAX) NULL,
InnerExceptionId INT NULL,
CONSTRAINT FK__Exceptions_Id__Exceptions_InnerExceptionId
FOREIGN KEY(InnerExceptionId) REFERENCES Exceptions (Id)
);
もちろん、正しく機能するコードを作成することもできます。たとえば、TVPを引数として受け取り、TVPの行をループして、新しい行を1つずつ挿入するストアドプロシージャなどです。
しかし、ネストを使用して例外をエレガントに挿入できるSQLコードはありますか?
TVPとカーソルループを使用してストアドプロシージャを作成することになりました。
これが私のテーブル値パラメーターの定義です:
CREATE TYPE ExceptionTableType AS TABLE
(
[Message] NVARCHAR(MAX) NOT NULL,
StackTrace NVARCHAR(MAX) NULL
);
カーソルループ付きのストアドプロシージャは次のとおりです
CREATE PROCEDURE LogException
@exceptions ExceptionTableType READONLY
AS
BEGIN
DECLARE @cursor CURSOR;
DECLARE @message NVARCHAR(MAX);
DECLARE @stackTrace NVARCHAR(MAX);
DECLARE @innerExceptionId INT = NULL;
DECLARE @outputTable TABLE (Id INT);
BEGIN
SET @cursor = CURSOR FOR
SELECT [Message], StackTrace
FROM @exceptions;
OPEN @cursor
FETCH NEXT FROM @cursor
INTO @message, @stackTrace;
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO Exceptions
([Message], StackTrace, InnerExceptionId)
OUTPUT INSERTED.Id INTO @outputTable (Id)
VALUES
(@message, @stackTrace, @innerExceptionId);
SELECT @innerExceptionId = Id
FROM @outputTable;
FETCH NEXT FROM @cursor
INTO @message, @stackTrace;
END;
CLOSE @cursor;
DEALLOCATE @cursor;
END
END
SQLを介したストアドプロシージャ呼び出しの例:
DECLARE @exceptions AS ExceptionTableType;
INSERT INTO @exceptions
([Message], [StackTrace])
VALUES
('My exception', 'Some stack trace here'),
('My inner exception', 'Dummy data'),
('My inner exception 2', 'Dummy data 2');
EXEC LogException @exceptions;
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加