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
'programing' 카테고리의 다른 글
Markdown에서 'target="_blank'로 링크를 만들 수 있습니까? (0) | 2023.04.13 |
---|---|
DbContext 사용방법데이터베이스저장 프로시저가 있는 SqlQuery(sql, params)? EF 코드 First CTP5 (0) | 2023.04.13 |
Wpf: 텍스트 상자에 드래그 앤 드롭 (0) | 2023.04.13 |
EPPlus를 사용하여 셀을 병합하시겠습니까? (0) | 2023.04.13 |
Swift에서 문자열을 Base64로 인코딩하려면 어떻게 해야 하나요? (0) | 2023.04.13 |