Запустить регулярное выражение на SQL Server [дубликат]

Насколько я понимаю, битовые поля являются чисто конструкциями компилятора

И это часть проблемы. Если использование бит-полей было ограничено тем, что принадлежит компилятору, то как компилятор упаковывал биты или заказывал их, он почти никому не беспокоился.

Однако битовые поля, вероятно, используется гораздо чаще для моделирования конструкций, которые являются внешними по отношению к домену компилятора - аппаратным регистрам, протоколу «провод» для связи или макет формата файла. У этих вещей есть строгие требования о том, как биты должны быть выложены, а использование битовых полей для их моделирования означает, что вам приходится полагаться на определенные реализацией и, что еще хуже, неуказанное поведение того, как компилятор будет макетировать бит-поле .

Короче говоря, бит-поля не указаны достаточно хорошо, чтобы сделать их полезными для ситуаций, которые, по-видимому, наиболее часто используются.

62
задан Control Freak 19 January 2012 в 17:09
поделиться

5 ответов

Вам не нужно взаимодействовать с управляемым кодом, так как вы можете использовать LIKE :

CREATE TABLE #Sample(Field varchar(50), Result varchar(50))
GO
INSERT INTO #Sample (Field, Result) VALUES ('ABC123 ', 'Do not match')
INSERT INTO #Sample (Field, Result) VALUES ('ABC123.', 'Do not match')
INSERT INTO #Sample (Field, Result) VALUES ('ABC123&', 'Match')
SELECT * FROM #Sample WHERE Field LIKE '%[^a-z0-9 .]%'
GO
DROP TABLE #Sample

Когда ваше выражение заканчивается на +, вы можете пойти с '%[^a-z0-9 .][^a-z0-9 .]%'

EDIT: сделать ясно: SQL Server не поддерживает регулярные выражения без управляемого кода. В зависимости от ситуации оператор LIKE может быть опцией, но ему не хватает гибкости, которую предоставляют регулярные выражения.

70
ответ дан Rubens Farias 17 August 2018 в 09:06
поделиться
  • 1
    @MikeYoung, ты прав. Этот ответ неправильно адресует квант + как {1,2}, когда он должен принимать его как {1, }. Удивительно, но это сработало с ОП. – Rubens Farias 28 April 2015 в 18:43
  • 2
    Это не будет работать в sql-сервере, поскольку оно не поддерживает регулярное выражение. – VVN 26 March 2016 в 05:17
  • 3
    @VVN, LIKE не является регулярным выражением (это более ограниченный синтаксис соответствия шаблону), поэтому отсутствие поддержки регулярного выражения не означает, что это не сработает. – Charles Duffy 16 April 2016 в 23:28
  • 4
    @RubensFarias было бы неплохо обновить ответ в свете комментариев от @ mike-young? – dotnetguy 6 March 2017 в 03:40

Вы можете использовать функцию в SqlServer и передать ей значение, которое вы хотите оценить. Посмотрите на эту ссылку: http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.80).aspx

4
ответ дан Giorgio Minardi 17 August 2018 в 09:06
поделиться
SELECT * from SOME_TABLE where NAME like '%[^A-Z]%'

Или какое-либо другое выражение вместо A-Z

2
ответ дан Kalyan Vasanth 17 August 2018 в 09:06
поделиться

Вам нужно будет создать CLR-процедуру, которая предоставляет функции регулярного выражения, как показано в этой статье .

6
ответ дан mwigdahl 17 August 2018 в 09:06
поделиться
  • 1
    Это в классическом ASP, поддерживает ли он? Я думаю, что CLR предназначен только для функций .NET, не так ли? – Control Freak 19 January 2012 в 17:12
  • 2
    Процедуры CLR устанавливаются в среду SQL Server и могут вызываться как любая другая хранимая процедура или пользовательская функция, поэтому, если Classic ASP может вызывать хранимую процедуру или пользовательскую функцию, она может вызывать процедуру CLR. – mwigdahl 19 January 2012 в 17:14
  • 3
    – Federico klez Culloca 19 September 2018 в 10:38
  • 4
  • 5
    – Federico klez Culloca 20 September 2018 в 06:48

Немного измененная версия ответа Хулио.

-- MS SQL using VBScript Regex
-- select dbo.RegexReplace('aa bb cc','($1) ($2) ($3)','([^\s]*)\s*([^\s]*)\s*([^\s]*)')
-- $$ dollar sign, $1 - $9 back references, $& whole match

CREATE FUNCTION [dbo].[RegexReplace]
(   -- these match exactly the parameters of RegExp
    @searchstring varchar(4000),
    @replacestring varchar(4000),
    @pattern varchar(4000)
)
RETURNS varchar(4000)
AS
BEGIN
    declare @objRegexExp int, 
        @objErrorObj int,
        @strErrorMessage varchar(255),
        @res int,
        @result varchar(4000)

    if( @searchstring is null or len(ltrim(rtrim(@searchstring))) = 0) return null
    set @result=''
    exec @res=sp_OACreate 'VBScript.RegExp', @objRegexExp out
    if( @res <> 0) return '..VBScript did not initialize'
    exec @res=sp_OASetProperty @objRegexExp, 'Pattern', @pattern
    if( @res <> 0) return '..Pattern property set failed'
    exec @res=sp_OASetProperty @objRegexExp, 'IgnoreCase', 0
    if( @res <> 0) return '..IgnoreCase option failed'
    exec @res=sp_OAMethod @objRegexExp, 'Replace', @result OUT,
         @searchstring, @replacestring
    if( @res <> 0) return '..Bad search string'
    exec @res=sp_OADestroy @objRegexExp
    return @result
END

Вам нужно, чтобы процедуры автоматизации Ole были включены в SQL:

exec sp_configure 'show advanced options',1; 
go
reconfigure; 
go
sp_configure 'Ole Automation Procedures', 1; 
go
reconfigure; 
go
sp_configure 'show advanced options',0; 
go
reconfigure;
go
5
ответ дан Zachary Scott 17 August 2018 в 09:06
поделиться
  • 1
    BTW, гораздо быстрее уничтожить и воссоздать объект регулярного выражения, чем кэшировать и повторно использовать его. Мы провели 10000 сравнений со значительно большим числом повторных использования объекта. – Zachary Scott 19 July 2016 в 15:26
Другие вопросы по тегам:

Похожие вопросы: