2015-06-24 20 views
1

表達我有一個生成bymyDBcontext.Database.Log = s => myTextWriter(s) SQL代碼:定期對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行,你不需要爲正則表達式。 「其他Insers在這裏」是什麼? – greenfeet

+0

@greenfeet,我也這麼認爲,但第二行有參數,這些參數位於命令下面的註釋部分。我猜測OP正在尋找一種方法將註釋中的值和「正則表達式」中的值存入命令 –

+0

爲什麼你要這樣記錄查詢的路由而不使用SQLProfiler,然後你可以重放在稍後階段給出命令,並看到實際執行的命令及其值都在一個語句中。 –

回答

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()