Здравствуйте, Win32nipuh, Вы писали:
W>Задача:
W>дана строка со скриптом хранимой процедуры в T-SQL, нужно в ней найти AS и заменить на WITH ENCRYPTION AS
W>Т.е. скрипт создает процедуры, а нужно их создать зашифрованными.
W>Вот есть такая функция
W>public static void ProcessProcedure(ref String scr)
W>{
W> Regex reg = new Regex("create(\\s*)procedure[\\S\\s.]*\\sas");
W> Match m = reg.Match(scr);
W> if(m.Success)
W> {
W> scr = scr.Replace(" as","as");
W> scr = scr.Replace("\nas","\nwith encryption as");
W> }
W>}
W>Она все делает.
W>Но здесь одна проблема: она не учитывает комментарии, т.е. если перед реальным AS будет стоять
W>CREATE PROCEDURE ....
W>/*
W>не забыть AS
W>*/
W>AS
W>или
W>--не забыть AS
W>AS
W>То сработает замена в комментарии.
W>Как обарботать комментарий и заменить нужное?
W>Спасибо!
Как-нибудь так.
using System;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication1
{
class Program
{
static void Main ( string[] args )
{
string mask = @"create\s+procedure(\s|(--[^\n]*)|(/\*.*?\*/))+(?=as)";
string[] tests =
{
"blah-blah-blah CREATE PROCEDURE\nAS blah-blah-blah",
"blah-blah-blah CREATE PROCEDURE \t\r\n \r\n" +
"/*** \r\n" +
" * c-style comment with CREATE PROCEDURE AS\r\n" +
"***/\r\n\r\n" +
"-- SQL comment with CREATE PROCEDURE AS \r\n\r\n" +
"AS"
};
foreach(string sql in tests)
{
Console.WriteLine ( "*** Original:\r\n'{0}'", sql );
Console.WriteLine ( "*** Replaced:\r\n'{0}'\r\n"
, Regex.Replace(sql, mask, "$&WITH ENCRYPTION "
, RegexOptions.IgnoreCase | RegexOptions.Singleline ) );
}
}
}
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>