Зачем это понадобилось:
Перед передачей проекта иностранному заказчику, желательно проверить в базе данных наличие записей с русским текстом.
Как было реализовано:
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 и готово.