[英]Extracting column names from CREATE SQL command with Regular Expressions
[英]Determine Whether SQL Command is an UPDATE command by regular expressions
我有很多來自實體框架的攔截器的SQL命令,如下所示:
UPDATE [dbo].[Products]
SET [Name] = @0
WHERE ([Id] = @1)
如何確定此命令是UPDATE
命令?
我寫了以下正則表達式:
(update)? [a-z0-9-]+ (set)
但是它不支持多行命令,命令文本應該在一行中,並且不支持名稱中帶有模式和[]
字符的表名。
它僅支持簡單的SQL命令,如下所示:
UPDATE Products SET [Name] = @0 WHERE ([Id] = @1)
注意:我正在使用此正則表達式和Entity Framework的IDbCommandInterceptor
功能向SQL Server提供UPDATE
命令的WITH (ROWLOCK)
表提示,因此我需要一個從UPDATE
關鍵字到SET
關鍵字的正則表達式,因為應該插入WITH (ROWLOCK)
在SET
關鍵字之前。
考慮以下代碼:
String updateCommandRegularExpression = "(update)? [a-z0-9-]+ (set)";
Boolean isUpdateCommand = Regex.IsMatch(commandText, updateCommandRegularExpression, RegexOptions.IgnoreCase | RegexOptions.Multiline); // You may use better regular expression pattern here.
if (isUpdateCommand)
{
Boolean isSnapshotIsolationTransaction = sqlCommand.Transaction != null && sqlCommand.Transaction.IsolationLevel == IsolationLevel.Snapshot;
// Transactions with Snapshot isolation level have more complicated table hints to enable rowlock.
String tableHintToAdd = isSnapshotIsolationTransaction ? " with (rowlock , updlock) set " : " with (rowlock) set ";
commandText = Regex.Replace(commandText, updateCommandRegularExpression, (match) =>
{
return Regex.Replace(match.Value, " SET ", tableHintToAdd, RegexOptions.IgnoreCase); // You may use better regular expression here.
}, RegexOptions.IgnoreCase | RegexOptions.Multiline);
command.CommandText = commandText;
}
這樣的事情怎么樣?
'[; \t]*[Uu][Pp][Dd][Aa][Tt][Ee][ \t]'
基本上,更新命令是第一個單詞被update
命令-至少對於簡單命令而言。 如果允許公用表表達式( with
語句),則邏輯更具挑戰性。
編輯:
我建議采用以下方法。 使用上面的表達式確定命令是否為更新。 然后,將“ set”替換為“(ROWLOCK)set”。 這將處理表可能具有特殊字符或使用別名的情況。 缺點是,如果表中包含“ set”,將無濟於事。
因為您是在C#中執行此操作,所以可以測試一下集合前后的字符是否為空格字符,而不是字母數字。
注意:如果update
已包含提示,則此操作將無法正常工作。 您可以通過在“設置”之前尋找“ with”來查找。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.