programing

T-SQL의 SQL Server 정규 표현식

padding 2023. 4. 13. 20:39
반응형

T-SQL의 SQL Server 정규 표현식

된 정규 T-SQL 없음).SP 호스팅과 . (SQL Server) (SQL Server ) 。

편집:

  • 는 감다다다에 대해 .겠습니니다다PATINDEX,LIKE,xp_ sps CLR (CLR)
  • 또한 regex를 위한 최적의 장소가 아니라는 것도 알고 있습니다.질문은 이론적인 것입니다:)
  • 기능 저하도 허용됩니다.

PATINDEX 기능은 어떻습니까?

TSQL의 패턴 매칭은 완전한 regex 라이브러리는 아니지만 기본을 제공합니다.

(온라인 서적부터)

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과 함께 regex를 사용하는 것에 관심이 있는 사람은, 이쪽이 해결책입니다.다음 함수(C# .net 4.5)는 패턴이 일치하면 1을 반환하고 패턴이 일치하지 않으면 0을 반환합니다.하위 쿼리의 행에 태그를 붙이기 위해 사용합니다.SQL 함수 속성은 이 방식이 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;
        }
    }
}

관리 스튜디오에서 프로그램 가능성(어셈블리)을 통해 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 함수를 데이터베이스에 추가할 수 있는 자유롭고 쉬운 방법입니다.

Server 2016을 사용할 수 .sp_execute_external_scriptㄹ게요. , 하다, 하다, 같은 정규 검색 .grep ★★★★★★★★★★★★★★★★★」grepl

하다SQL Server 데이터베이스 엔진을 통해 몇 명의 "사람"을 조회하여 해당 사용자의 데이터를 R에게 전달하고 R이 잘못된 이메일 주소를 가진 사용자를 결정하도록 한 후 R이 해당 사용자의 서브셋을 SQL Server에 다시 전달하도록 하겠습니다.은 '사람' 이다.[Application].[People]의 표[WideWorldImporters]데이터 프레임 R엔진됩니다.InputDataSet. R은 "not" 연산자( 느낌표!)와 함께 grepl 함수를 사용하여 RegEx 문자열 검색 패턴과 일치하지 않는 전자 메일 주소를 가진 사용자를 찾습니다.

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 Services"라고 합니다.SQL Server 2017에서는 "SQL Server Machine Learning Services"로 이름이 변경되었습니다.

결론: 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방법은 이쪽에서 이용할 수 있습니다.

해피 코딩

언급URL : https://stackoverflow.com/questions/194652/sql-server-regular-expressions-in-t-sql

반응형