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