我从Entity框架的拦截器中获得了大量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 WITH (ROWLOCK)
命令提供UPDATE
表提示,所以我需要来自{{1}的正则表达式关键字到UPDATE
关键字,因为SET
应该在WITH (ROWLOCK)
关键字之前插入。
请考虑以下代码:
SET
答案 0 :(得分:1)
这样的事情怎么样?
'[; \t]*[Uu][Pp][Dd][Aa][Tt][Ee][ \t]'
基本上,更新命令是第一个单词为update
的命令 - 至少对于简单命令。如果允许公用表表达式(with
语句),则逻辑更具挑战性。
编辑:
我建议采用以下方法。使用上面的表达式来确定命令是否是更新。然后,将“set”替换为“with(ROWLOCK)set”。这将处理表可能具有特殊字符或使用别名的情况。一个缺点是,如果表中包含“set”,它将无济于事。
因为您是在C#中执行此操作,所以您可以测试该集合之前和之后的字符是否为空格字符而不是字母数字。
注意:如果update
已经有提示,这将无法正常工作。您可以通过在“设置”之前查找“with”来查找。