[sql-server] T-SQL의 SQL Server 정규식

SPSQL Server에 대해 T-SQL (CLR 없음, 확장 , 순수 T-SQL 없음)로 작성된 정규식 라이브러리가 있으며 공유 호스팅과 작동해야합니까?

편집하다:

  • 덕분에, 나는에 대해 알고 PATINDEX, LIKE, xp_ sps및 CLR 솔루션을
  • 나는 또한 그것이 정규 표현식을위한 최고의 장소가 아니라는 것을 알고 있습니다. 질문은 이론적입니다 🙂
  • 기능 감소도 허용됩니다


답변

방법에 대한 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]).


답변

CLR과 함께 정규식을 사용하는 데 관심이 있다면 여기에 해결책이 있습니다. 아래 함수 (C # .net 4.5)는 패턴이 일치하면 1을, 패턴이 일치하지 않으면 0을 반환합니다. 하위 쿼리에서 행에 태그를 지정하는 데 사용합니다. SQLfunction 속성은이 방법이 SQL 서버가 사용할 실제 UDF임을 SQL 서버에 알려줍니다. 파일을 management studio에서 액세스 할 수있는 장소에 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를 사용하여 사용할 수있는 몇 가지 기본 패턴 일치가 있습니다. 여기서 %는 숫자 및 문자 조합과 일치하고 _는 하나의 문자와 일치하며 [abc]는 a, b 또는 c와 일치 할 수 있습니다. MSDN 사이트 에 대한 추가 정보가 있습니다. .


답변

SQL Server 2016 이상을 사용 sp_execute_external_script하는 경우 R과 함께 사용할 수 있습니다 . 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 서비스”라고합니다. SQL Server 2017의 경우 이름이 “SQL Server Machine Learning Services”로 바뀌 었습니다.

결산 사고
Microsoft의 SQL (T-SQL) 구현은 RegEx를 기본적으로 지원하지 않습니다. 이 제안 된 솔루션은 CLR 저장 프로 시저를 사용하는 것보다 OP에 더 이상 바람직하지 않을 수 있습니다. 그러나 문제에 접근하는 추가 방법을 제공합니다.


답변

다른 사람이 여전히이 질문을보고있는 경우 http://www.sqlsharp.com/정규식 CLR 함수 를 데이터베이스 에 추가 할 수 있는 무료 방법 입니다.


답변

OLE 자동화를 사용하여 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방법 에 대한 자세한 내용은 여기를 참조하십시오

행복한 코딩


답변