如果有人对将正则表达式与CLR一起使用感兴趣,那么这里是一个解决方案。下面的函数(C#.net 4.5)如果模式匹配则返回1,如果模式不匹配则返回0。我用它来标记子查询中的行。SQLfunction属性告诉sql server,此方法是SQL Server将使用的实际UDF。将文件另存为dll,放在可以从Management Studio访问的位置。
// 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