当前位置:  开发笔记 > 编程语言 > 正文

T-SQL中的SQL Server正则表达式

如何解决《T-SQL中的SQLServer正则表达式》经验,为你挑选了3个好方法。

是否有为SQL Server 编写的SP(不PATINDEX,没有扩展LIKE,纯xp_)的正则表达式库?

(应该与共享主机一起使用)

编辑:

谢谢我知道sps,SPxp_ PATINDEXCLR`解决方案

我也知道它不是最好的地方LIKE,问题是理论:)

功能减少也被接受

Eric Z Beard.. 76

如何在PATINDEX函数?

TSQL中的模式匹配不是一个完整的正则表达式库,但它为您提供了基础知识.

(来自联机丛书)

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]).

至少十年(SQL Server 2005+),`LIKE`支持`PATINDEX`所做的一切.之前不知道...... (6认同)


小智.. 18

如果有人有兴趣使用正则表达式与CLR这里是一个解决方案.如果模式匹配,则下面的函数(C#.net 4.5)返回1,如果模式不匹配则返回0.我用它来标记子查询中的行.SQLfunction属性告诉sql server此方法是SQL服务器将使用的实际UDF.将文件另存为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;
        }
    }
}

在管理工作室中,通过可编程性 - 程序集 - 新程序集导入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


Steven Muraw.. 14

通过使用LIKE可以获得一些基本模式匹配,其中%匹配任何数字和字符组合,_匹配任何一个字符,[abc]可以匹配a,b或c ... MSDN网站上有更多信息.



1> Eric Z Beard..:

如何在PATINDEX函数?

TSQL中的模式匹配不是一个完整的正则表达式库,但它为您提供了基础知识.

(来自联机丛书)

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]).


至少十年(SQL Server 2005+),`LIKE`支持`PATINDEX`所做的一切.之前不知道......

2> 小智..:

如果有人有兴趣使用正则表达式与CLR这里是一个解决方案.如果模式匹配,则下面的函数(C#.net 4.5)返回1,如果模式不匹配则返回0.我用它来标记子查询中的行.SQLfunction属性告诉sql server此方法是SQL服务器将使用的实际UDF.将文件另存为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;
        }
    }
}

在管理工作室中,通过可编程性 - 程序集 - 新程序集导入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



3> Steven Muraw..:

通过使用LIKE可以获得一些基本模式匹配,其中%匹配任何数字和字符组合,_匹配任何一个字符,[abc]可以匹配a,b或c ... MSDN网站上有更多信息.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有