2015-06-24 3 views
1

У меня есть SQL-код, который был создан bymyDBcontext.Database.Log = s => myTextWriter(s):Регулярного выражения для DBContext.Database.Log

INSERT [dbo].[Commodities]([IsGas], [IsPower], [Name]) 
VALUES (@0, @1, @2) 
SELECT [Id] 
FROM [dbo].[Commodities] 
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity() 

-- @0: 'True' (Type = Boolean) 
-- @1: 'False' (Type = Boolean) 
-- @2: 'Gas' (Type = String, Size = -1) 
-- Executing at 24.6.2015 13:20:32 +02:00 
-- Completed in 0 ms with result: SqlDataReader 

-- 
--Other Inserts here 
-- 

Я хотел бы выполнить этот запрос SQL на моем тестовом сервере. К сожалению, этот код sql не является исполняемым. Мне нужно что-то вроде этого:

INSERT [dbo].[Commodities]([IsGas], [IsPower], [Name]) 
VALUES (1, 0, 'Gas') 
SELECT [Id] 
FROM [dbo].[Commodities] 
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity() 

Не могли бы вы дать мне совет, как обработать этот SQL (с регулярными выражениями, я думаю), так что он стал исполняемым?

+0

Если вам нужно только первые 5 строк, вам не нужно регулярное выражение для этого. Что находится в «Other Insers here»? – greenfeet

+0

@greenfeet, я также думал, что, но вторая строка имеет параметры whos vaues внутри раздела комментариев под командой. Я угадываю, что OP ищет способ взять значения из комментариев и «повторно выставить» их в команду –

+0

Почему вы пошли по пути регистрации таких запросов, а не с помощью SQLProfiler, с помощью которого вы можете воспроизвести команды give на более позднем этапе и увидеть фактические исполняемые команды со своими значениями в одном выражении. –

ответ

0

Вам необходимо удалить все строки, начинающиеся с --, и пустые строки, а затем использовать значения из комментариев, вставленных в строку VALUES.

Следующий код может быть полезен:

var rxGetValues = new Regex(@"(?ms)(?<=^VALUES\s+\([^)]*?)@(?<id>\d+)(?=.*?^-{2}\[email protected]\k<id>:\s+'(?<val>[^']*)')"); 
var str = "YOUR_STRING"; 
str = rxGetValues.Replace(str, m => m.Groups["val"].Value.ToLower() == "false" 
           || m.Groups["val"].Value.ToLower() == "true" ? 
       Convert.ToInt32(Boolean.Parse(m.Groups["val"].Value)).ToString() 
       : m.Groups["val"].Value); 
str = string.Join(Environment.NewLine, str.Split(new[] { "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries).Where(p => !p.Trim().StartsWith("--")).ToArray()); 

Результат:

INSERT [dbo].[Commodities]([IsGas], [IsPower], [Name]) 
VALUES (1, 0, Gas) 
SELECT [Id] 
FROM [dbo].[Commodities] 
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity() 
Смежные вопросы