簡體   English   中英

通過正則表達式確定SQL命令是否為UPDATE命令

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM