Подтвердить что ты не робот

Регулярные выражения SQL Server в T-SQL

Существует ли какая-либо библиотека регулярных выражений, написанная на T-SQL (без CLR, без расширенного SP, чистый T-SQL) для SQL Server?

(должен работать с виртуальным хостингом)

Редактировать:

  • спасибо я знаю о PATINDEX, LIKE, xp_ SPS and CLR 'решения

  • Я также знаю, что это не лучшее место для regex, вопрос теоретический :)

  • уменьшенная функциональность также принимается

4b9b3361

Ответ 1

Как насчет функции 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]).

Ответ 2

Существует несколько базовых сопоставлений шаблонов, доступных с помощью LIKE, где% соответствует любому числу и комбинации символов, _ соответствует любому одному символу, а [abc] может соответствовать a, b или c... Более подробная информация о сайте MSDN.

Ответ 3

Если кто-то заинтересован в использовании регулярного выражения с CLR, то это решение. Функция ниже (С#.net 4.5) возвращает 1, если шаблон сопоставляется, и 0, если шаблон не сопоставляется. Я использую его для маркировки строк в подзапросах. Атрибут SQLfunction сообщает серверу 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

Ответ 4

Если кто-то еще смотрит на этот вопрос, http://www.sqlsharp.com/ - это бесплатный, простой способ добавить регулярное выражение CLR функции в вашу базу данных.

Ответ 5

Если вы используете SQL Server 2016 или выше, вы можете использовать sp_execute_external_script вместе с R. Он имеет функции для поиска регулярного выражения, такие как grep и grepl.

Вот пример адресов электронной почты. Я запрошу некоторых "людей" с помощью механизма базы данных SQL Server, передам данные для этих людей в R, пусть R решит, какие люди имеют недействительные адреса электронной почты, и попросит R передать это подмножество людей на SQL Server. "Люди" находятся в таблице [Application].[People] в базе данных примеров [WideWorldImporters]. Они передаются движку R в качестве блока данных с именем InputDataSet. R использует функцию grepl с оператором "not" (восклицательный знак!), Чтобы найти, какие люди имеют адреса электронной почты, которые не соответствуют шаблону поиска строк в 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".

Заключительные мысли Реализация SQL SQL (T-SQL) не имеет встроенной поддержки RegEx. Это предлагаемое решение может быть не более желательным для OP, чем использование хранимой процедуры CLR. Но он предлагает дополнительный способ подойти к проблеме.

Ответ 6

Вы можете использовать функции регулярного выражения VBScript, используя OLE Automation. Это намного лучше, чем накладные расходы на создание и обслуживание сборки. Пожалуйста, ознакомьтесь с разделом комментариев, чтобы получить улучшенную версию основной версии.

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 доступна здесь

Счастливое кодирование