SQL Server用にT-SQL
(CLR
なし、拡張SP
なし、純粋T-SQL
)で記述された正規表現ライブラリはありますか?
(共有ホスティングで動作するはずです)
編集:
PATINDEX
、LIKE,
xp_spsand
CLR`ソリューションについて知っているおかげで
regex
に最適な場所ではないことも知っています。質問は理論的です:)
機能制限も受け入れられます
PATINDEX 関数はどうですか?
TSQLのパターンマッチングは完全な正規表現ライブラリではありませんが、基本を提供します。
(Books Onlineから)
Wildcard Meaning
% Any string of zero or more characters.
_ Any single character.
[ ] Any single character within the specified range
(for example, [a-f]) or set (for example, [abcdef]).
[^] Any single character not within the specified range
(for example, [^a - f]) or set (for example, [^abcdef]).
誰かがCLRで正規表現を使用することに興味があるなら、ここに解決策があります。以下の関数(C#.net 4.5)は、パターンが一致する場合は1を返し、パターンが一致しない場合は0を返します。サブクエリの行にタグを付けるために使用します。 SQLfunction属性は、このメソッドがSQLサーバーが使用する実際のUDFであることをSQLサーバーに伝えます。ファイルを管理スタジオからアクセスできる場所にdllとして保存します。
// default using statements above
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Text.RegularExpressions;
namespace CLR_Functions
{
public class myFunctions
{
[SqlFunction]
public static SqlInt16 RegexContain(SqlString text, SqlString pattern)
{
SqlInt16 returnVal = 0;
try
{
string myText = text.ToString();
string myPattern = pattern.ToString();
MatchCollection mc = Regex.Matches(myText, myPattern);
if (mc.Count > 0)
{
returnVal = 1;
}
}
catch
{
returnVal = 0;
}
return returnVal;
}
}
}
Management Studioで、プログラマビリティを介してdllファイルをインポートします-アセンブリ-新しいアセンブリ
次に、このクエリを実行します。
CREATE FUNCTION RegexContain(@text NVARCHAR(50), @pattern NVARCHAR(50))
RETURNS smallint
AS
EXTERNAL NAME CLR_Functions.[CLR_Functions.myFunctions].RegexContain
その後、アセンブリを保存したデータベースを介して関数に完全にアクセスできるようになります。
次に、次のようなクエリで使用します。
SELECT *
FROM
(
SELECT
DailyLog.Date,
DailyLog.Researcher,
DailyLog.team,
DailyLog.field,
DailyLog.EntityID,
DailyLog.[From],
DailyLog.[To],
dbo.RegexContain(Researcher, '[\p{L}\s]+') as 'is null values'
FROM [DailyOps].[dbo].[DailyLog]
) AS a
WHERE a.[is null values] = 0
LIKEを使用して利用できる基本的なパターンマッチングがあります。%は任意の数と文字の組み合わせに一致し、_は任意の1文字に一致し、[abc]はa、b、またはcに一致します。 MSDNサイト 。
他の誰かがまだこの質問を見ている場合、 http://www.sqlsharp.com/ は無料、正規表現を追加する簡単な方法CLR関数をデータベースに追加します。
SQL Server 2016以降を使用している場合は、Rと共にsp_execute_external_script
を使用できます。これには、grep
やgrepl
などの正規表現検索用の機能があります。
メールアドレスの例を次に示します。 SQL Serverデータベースエンジンを介して「人」にクエリを実行し、それらの人のデータをRに渡し、Rに無効な電子メールアドレスを持つ人を決定させ、Rがその人のサブセットをSQL Serverに戻すようにします。 「人」は、[Application].[People]
サンプルデータベースの[WideWorldImporters]
テーブルからのものです。これらは、InputDataSet
という名前のデータフレームとしてRエンジンに渡されます。 Rは、regpl文字列検索パターンに一致しない電子メールアドレスを持っている人を見つけるために、「not」演算子(感嘆符!)とともにgrepl関数を使用します。
EXEC sp_execute_external_script
@language = N'R',
@script = N' RegexWithR <- InputDataSet;
OutputDataSet <- RegexWithR[!grepl("([_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4}))", RegexWithR$EmailAddress), ];',
@input_data_1 = N'SELECT PersonID, FullName, EmailAddress FROM Application.People'
WITH RESULT SETS (([PersonID] INT, [FullName] NVARCHAR(50), [EmailAddress] NVARCHAR(256)))
適切な機能をSQL Serverホストにインストールする必要があることに注意してください。 SQL Server 2016の場合、「SQL Server Rサービス」と呼ばれます。 SQL Server 2017では、「SQL Server Machine Learning Services」に名前が変更されました。
Closing Thoughts MicrosoftのSQL(T-SQL)の実装には、RegExのネイティブサポートがありません。この提案されたソリューションは、CLRストアドプロシージャの使用よりもOPにとって望ましいものではありません。しかし、それは問題にアプローチするための追加の方法を提供します。
OLE Automationを使用して、VBScriptの正規表現機能を使用できます。これは、アセンブリを作成および保守するオーバーヘッドよりもはるかに優れています。メインセクションの修正バージョンを入手するには、コメントセクションを必ず確認してください。
http://blogs.msdn.com/b/khen1234/archive/2005/05/11/416392.aspx
DECLARE @obj INT, @res INT, @match BIT;
DECLARE @pattern varchar(255) = '<your regex pattern goes here>';
DECLARE @matchstring varchar(8000) = '<string to search goes here>';
SET @match = 0;
-- Create a VB script component object
EXEC @res = sp_OACreate 'VBScript.RegExp', @obj OUT;
-- Apply/set the pattern to the RegEx object
EXEC @res = sp_OASetProperty @obj, 'Pattern', @pattern;
-- Set any other settings/properties here
EXEC @res = sp_OASetProperty @obj, 'IgnoreCase', 1;
-- Call the method 'Test' to find a match
EXEC @res = sp_OAMethod @obj, 'Test', @match OUT, @matchstring;
-- Don't forget to clean-up
EXEC @res = sp_OADestroy @obj;
SQL Server blocked access to procedure 'sys.sp_OACreate'...
エラーが発生した場合は、sp_reconfigure
を使用してOle Automation Procedures
を有効にしてください。 (はい、残念ながらサーバーレベルの変更です!)
Test
メソッドに関する詳細情報が利用可能です here
ハッピーコーディング