ワンランク上のSQL Server Profilerを目指せ!列フィルター「NOT LIKE」の複数値指定を使いこなす

2024-06-21

SQL Server Profiler で列フィルターに「NOT LIKE」を複数値で指定する方法

「NOT LIKE」列フィルターは、特定の文字列パターンと一致しないイベントをフィルター処理するために使用されます。しかし、デフォルトでは、単一の文字列パターンしか指定できません。

では、複数の文字列パターンと一致しないイベントをフィルター処理するにはどうすればよいでしょうか?

その方法はいくつかあります。

方法 1:複数の「NOT LIKE」フィルターを使用する

最も簡単な方法は、複数の「NOT LIKE」フィルターをそれぞれ異なる列に設定することです。

例えば、"LoginName" 列に次のフィルターを設定すると、"user1" または "user2" にログインしたイベントを除外できます。

NOT LoginName LIKE 'user1'
AND NOT LoginName LIKE 'user2'

方法 2:LIKE 演算子と NOT 演算子を組み合わせて使用する

より複雑な方法としては、LIKE 演算子と NOT 演算子を組み合わせて使用するする方法があります。

NOT LoginName LIKE '%user1%'
AND NOT LoginName LIKE '%user2%'

方法 3:UDFを使用する

最も柔軟な方法は、UDF(ユーザー定義関数)を使用して、フィルター条件をカスタマイズする方法です。

例えば、次の UDF を作成して、"LoginName" 列に含まれる文字列が "user1" または "user2" であるかどうかを判断できます。

CREATE FUNCTION IsInvalidLoginName(@loginName NVARCHAR(255))
RETURNS BIT
AS
BEGIN
    DECLARE @isInvalid BIT;

    SET @isInvalid = 0;

    IF @loginName LIKE '%user1%'
    OR @loginName LIKE '%user2%'
    SET @isInvalid = 1;

    RETURN @isInvalid;
END;

この UDF を使用して、"LoginName" 列に次のフィルターを設定できます。

NOT IsInvalidLoginName(LoginName)

    補足:

    • 上記の例では、"LoginName" 列をフィルターしていますが、他の列にも同様に適用できます。
    • 複数の列をフィルター処理する場合は、AND 演算子を使用して条件を連結できます。
    • より複雑なフィルター条件を作成するには、NOT IN, SUBSTRING, PATINDEX などの他の T-SQL 関数を使用することもできます。

    ご参考になりましたでしょうか?




    SQL Server Profiler で列フィルターに「NOT LIKE」を複数値で指定する:サンプルコード

    -- イベントをトレースする
    CREATE TRACE MyTrace
    GO
    
    -- LoginName 列にフィルターを追加する
    BEGIN TRACE MyTrace
        ADD EVENTCOLUMN LoginName
    END TRACE MyTrace
    
    -- "user1" または "user2" にログインしたイベントを除外するフィルターを追加する
    BEGIN ALTER TRACE MyTrace
        ADD FILTER (
            NOT LoginName LIKE 'user1'
            AND NOT LoginName LIKE 'user2'
        )
    END ALTER TRACE MyTrace
    
    -- トレースを開始する
    START TRACE MyTrace
    
    -- イベントをトレースする
    CREATE TRACE MyTrace
    GO
    
    -- LoginName 列にフィルターを追加する
    BEGIN TRACE MyTrace
        ADD EVENTCOLUMN LoginName
    END TRACE MyTrace
    
    -- "user1" または "user2" を含む文字列でログインしたイベントを除外するフィルターを追加する
    BEGIN ALTER TRACE MyTrace
        ADD FILTER (
            NOT LoginName LIKE '%user1%'
            AND NOT LoginName LIKE '%user2%'
        )
    END ALTER TRACE MyTrace
    
    -- トレースを開始する
    START TRACE MyTrace
    
    -- UDFを作成する
    CREATE FUNCTION IsInvalidLoginName(@loginName NVARCHAR(255))
    RETURNS BIT
    AS
    BEGIN
        DECLARE @isInvalid BIT;
    
        SET @isInvalid = 0;
    
        IF @loginName LIKE '%user1%'
        OR @loginName LIKE '%user2%'
        SET @isInvalid = 1;
    
        RETURN @isInvalid;
    END;
    
    -- イベントをトレースする
    CREATE TRACE MyTrace
    GO
    
    -- LoginName 列と IsInvalidLoginName UDF を追加する
    BEGIN TRACE MyTrace
        ADD EVENTCOLUMN LoginName
        ADD EVENTCOLUMN IsInvalidLoginName = dbo.IsInvalidLoginName(LoginName)
    END TRACE MyTrace
    
    -- IsInvalidLoginName 列が TRUE のイベントを除外するフィルターを追加する
    BEGIN ALTER TRACE MyTrace
        ADD FILTER (
            NOT IsInvalidLoginName
        )
    END ALTER TRACE MyTrace
    
    -- トレースを開始する
    START TRACE MyTrace
    

    これらの例は、基本的な概念を示すものです。

    実際のシナリオでは、必要に応じてフィルター条件をさらに複雑にする必要がある場合があります。




    SQL Server Profiler で列フィルターに「NOT LIKE」を複数値で指定する方法:その他の方法

    "user1""user2" を含むすべての文字列を格納するテーブルを作成し、NOT IN 演算子を使用して、そのテーブルに含まれる文字列でログインしたイベントを除外できます。

    例えば、"InvalidLogins" という名前のテーブルを作成し、次の列を含めます。

    CREATE TABLE InvalidLogins (
        LoginName NVARCHAR(255) PRIMARY KEY
    );
    

    次に、"user1""user2" をこのテーブルに挿入します。

    INSERT INTO InvalidLogins (LoginName)
    VALUES
    ('user1'),
    ('user2');
    
    NOT LoginName IN (
        SELECT LoginName FROM InvalidLogins
    )
    

    例えば、次の XML 文書を作成します。

    <InvalidLogins>
        <LoginName>user1</LoginName>
        <LoginName>user2</LoginName>
    </InvalidLogins>
    
    NOT LoginName IN (
        SELECT LoginName FROM CONVERT(NVARCHAR(MAX), xmlColumn, 1) AS xmlData
            CROSS APPLY xmlData.nodes('/InvalidLogins/LoginName') AS row
            WHERE row.value('.', 'NVARCHAR(255)') IS NOT NULL
    )
    

    方法 6:ストアド プロシージャを使用する

    例えば、次のストアド プロシージャを作成します。

    CREATE PROCEDURE GetInvalidLogins
    AS
    BEGIN
        SELECT LoginName
        FROM InvalidLogins;
    END PROCEDURE;
    
    NOT LoginName IN (
        EXEC GetInvalidLogins
    )
    

    これらの方法は、より高度な方法であり、複雑なシナリオに適しています。

    **最適な方法は、要件とスキルレベルによって異なります。


    sql-server profiler


    SQL Server の ntext 列のデータ長

    ntext 列のデータ長を確認するには、次の方法があります:LEN() 関数: LEN() 関数は、文字列の長さを返します。ntext 列の場合、LEN() 関数は文字数を返します。sys. columns ビュー: sys. columns ビューは、テーブルの列に関する情報を提供します。ntext 列の場合、sys...


    DATETIME 列の検索をマスター! SQL Server での LIKE 演算子と代替方法

    SQL Server における DATETIME 列を LIKE 演算子を使って検索することは、文字列検索と異なり、いくつかの注意点と考慮事項があります。ここでは、DATETIME 列を LIKE 演算子で効率的に検索する方法について、分かりやすく解説します。...


    SQL Serverでデッドロックが発生する原因とは?

    SQL Server におけるデッドロックは、複数のプロセスが互いにロックされたリソースを待機し、膠着状態に陥る現象です。 この状態になると、いずれのプロセスも処理を進めることができなくなり、パフォーマンスの低下やアプリケーションの停止などの問題を引き起こします。...


    SQL ServerでJSONデータを格納するその他の方法:XML型、バイナリ型、外部ファイル

    JSONデータを格納するには、主に以下の2つの方法があります。文字列型利点:比較的軽量文字列型利点:比較的軽量比較的軽量JSONデータ型利点:JSONデータの操作に特化した関数やインデックスを利用できるパフォーマンスが優れている欠点:文字列型よりも多くのストレージ領域を必要とする...


    データベース容量の肥大化を防ごう!SQL Server データベースのサイズを確認する方法

    クエリを使用するこのクエリを実行すると、以下の情報を含む結果セットが返されます。データベースの名前データベース ファイルの物理的な場所データベース ファイルが占有する予約済みスペース (MB および GB)システム ビューを使用するSQL Server 2008 以降では、sys...