Поиск в базе данных MS SQ Server 2005 c помощью регулярных выражений

Зачем это понадобилось:
Перед передачей проекта иностранному заказчику, желательно проверить в базе данных наличие записей с русским текстом.

Как было реализовано:

1) Создание в базе функции для работы с регулярными выражениями ( решение найдено было на http://forum.vingrad.ru/forum/s/8d11cbaab23c3d92fc23f820249b292c/topic-1...)

CREATE FUNCTION [dbo].[fn_RegExpMatch]
    (
        @source varchar(5000),
        @REGEXP varchar(1000),
        @ignorecase bit = 0
    )
RETURNS bit
AS
    BEGIN
        DECLARE @hr integer
        DECLARE @objRegExp integer
        DECLARE @objMatches integer
        DECLARE @objMatch integer
        DECLARE @count integer
        DECLARE @results bit
       
        EXEC @hr = sp_OACreate 'VBScript.RegExp', @objRegExp OUTPUT
        IF @hr > 0 BEGIN
            SET @results = 0
            RETURN @results
        END
        EXEC @hr = sp_OASetProperty @objRegExp, 'Pattern', @REGEXP
        IF @hr > 0 BEGIN
            SET @results = 0
            RETURN @results
        END
        EXEC @hr = sp_OASetProperty @objRegExp, 'Global', false
        IF @hr > 0 BEGIN
            SET @results = 0
            RETURN @results
        END
        EXEC @hr = sp_OASetProperty @objRegExp, 'IgnoreCase', @ignorecase
        IF @hr > 0 BEGIN
            SET @results = 0
            RETURN @results
        END    
        EXEC @hr = sp_OAMethod @objRegExp, 'Test', @results OUTPUT, @source
        IF @hr > 0 BEGIN
            SET @results = 0
            RETURN @results
        END
        EXEC @hr = sp_OADestroy @objRegExp
        IF @hr > 0 BEGIN
            SET @results = 0
            RETURN @results
        END
    RETURN @results
    END

Для использования функции необходимо разрешить на сервере Ole Automation, например через Surface Area Configuration for Features

2) Поиск в базе данных текстовых полей содержащих русские символы, следующим скриптом:

DECLARE
        @TableName nvarchar(250),
        @ColumnName nvarchar(250),
        @ColumnLength int,
        @ColumnTypeName nvarchar(250),
        @SQLCommand nvarchar(max)

        SET NOCOUNT ON

        SELECT
                c.name AS [TableName],
                a.name AS [ColumnName],
                a.max_length AS [Length],
                b.name AS [TypeName]
        INTO ColumnsTable
        FROM sys.COLUMNS a
                INNER JOIN sys.types b
                ON a.user_type_id = b.user_type_id
                INNER JOIN sys.TABLES c
                ON c.object_id = a.object_id
        WHERE b.name IN ('text','ntext','varchar','char','nvarchar','nchar')
        AND a.name > 'URL'
        ORDER BY c.name,a.name
        CREATE TABLE Rudiments (TableName sysname,ColumnName sysname,Text nvarchar(max))

        DECLARE TColumns CURSOR FOR
        SELECT
                [TableName],
                [ColumnName],
                [Length],
                [TypeName]
        FROM ColumnsTable

        OPEN TColumns
        FETCH NEXT FROM TColumns
        INTO
                @TableName,
                @ColumnName,
                @ColumnLength,
                @ColumnTypeName        
        WHILE @@FETCH_STATUS = 0
        BEGIN
                SET @SQLCommand = 'INSERT INTO Rudiments (TableName,ColumnName,Text)'
                SET @SQLCommand = @SQLCommand + ' SELECT @P1,@P2,' + @ColumnName + ' FROM ' + @TableName
                SET @SQLCommand = @SQLCommand + ' WHERE [dbo].[fn_RegExpMatch](' + @ColumnName + N',''[А-Я]'',1) = 1'
                exec sp_executesql @SQLCommand,N'@P1 sysname,@P2 sysname',@TableName,@ColumnName

                FETCH NEXT FROM TColumns
                INTO
                        @TableName,
                        @ColumnName,
                        @ColumnLength,
                        @ColumnTypeName
        END
        CLOSE TColumns
        DEALLOCATE TColumns


        DROP TABLE ColumnsTable

        SELECT * FROM Rudiments
        DROP TABLE Rudiments

В результате получаем список в котором есть название таблицы, название поля и текст с русскими символами. Переводим текст, обновляем таблицы через Update и готово.

Нравится

Поделиться

1 комментарий

Спасибо за функцию!

Показать все комментарии