Заключение: я отмечаю, что этому все еще уделяется немного внимания, поэтому я добавлю здесь подробности моего окончательного решения.
Оказывается, ничто не сравнится с тем, чтобы сделать это для себя. Я создал простое консольное приложение, которое анализировало мою хранимую процедуру и выкладывало то, что я хотел. Добавив его в список внешних инструментов и передав текущее имя файла в качестве аргумента, я мог бы использовать следующее, чтобы вычеркнуть и переставить то, что мне было нужно.
При использовании я бы добавил новый файл sql, вставил в файл sql, сохранил его и запустил внешний инструмент. После завершения IDE просит меня перезагрузить файл. Пуф, больше нет хранимой процедуры.
Замечу, что это может не работать с каждым оператором executetesql, поэтому вам придется изменить его, если он не соответствует вашим потребностям.
class Program
{
const string query = "query";
const string decls = "decls";
const string sets = "sets";
static void Main(string[] args)
{
try
{
var text = File.ReadAllText(args[0]);
if(string.IsNullOrEmpty(text))
{
Console.WriteLine("File is empty. Try saving it before using the hillbilly sproc decoder");
}
var regex = new Regex(@"exec sp_executesql N'(?<" + query + ">.*)',N'(?<" + decls + ">[^']*)',(?<" + sets + ">.*)", RegexOptions.Singleline);
var match = regex.Match(text);
if(!match.Success || match.Groups.Count != 4)
{
Console.WriteLine("Didn't capture that one. Shit.");
Console.Read();
return;
}
var sb = new StringBuilder();
sb.Append("DECLARE ").AppendLine(match.Groups[decls].Value);
foreach(var set in match.Groups[sets].Value.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
sb.Append("SET ").AppendLine(set);
sb.AppendLine(match.Groups[query].Value.Replace("''", "'"));
File.WriteAllText(args[0], sb.ToString());
}
catch(Exception ex)
{
Console.WriteLine("S*t blew up, yo");
Console.WriteLine(ex.ToString());
Console.WriteLine("Press a key to exit");
Console.Read();
}
}
}