Задача:
дана строка со скриптом хранимой процедуры в T-SQL, нужно в ней найти AS и заменить на WITH ENCRYPTION AS
Т.е. скрипт создает процедуры, а нужно их создать зашифрованными.
Вот есть такая функция
public static void ProcessProcedure(ref String scr)
{
Regex reg = new Regex("create(\\s*)procedure[\\S\\s.]*\\sas");
Match m = reg.Match(scr);
if(m.Success)
{
scr = scr.Replace(" as","as");
scr = scr.Replace("\nas","\nwith encryption as");
}
}
Она все делает.
Но здесь одна проблема: она не учитывает комментарии, т.е. если перед реальным AS будет стоять
CREATE PROCEDURE ....
/*
не забыть AS
*/
AS
или
--не забыть AS
AS
То сработает замена в комментарии.
Как обарботать комментарий и заменить нужное?
Здравствуйте, VladGalkin, Вы писали:
_FR>>В примерах GoldParser была, кажется, граматика T-SQL…
VG>А где именно? И была ли? И где можно грамматику для T-SQL глянуть/скачать, а то есть необходимость её заиметь.
Есть к нему chm-файл, в нём, в качестве примера, она приведене и была.
... << RSDN@Home 1.2.0 alpha rev. 648>>
Now playing: «Тихо в лесу…»
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, 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 ) );
}
}
}
}