我试图确保某些存储过程不应该有RETURN
语句,除了最后一个。对于此任务,我尝试在PowerShell脚本上使用常规表达式。
我的策略是检查每个IF @@ERROR<>0
块并在其中执行另一次搜索。如何匹配此SQL查询的每个IF
块的内容?
--Some code here...
IF @@ERROR<>0
BEGIN
RAISERROR('MY ERROR HERE. %s',1,16,@STORE_PROCEDURE_NAME)
GOTO ROLL
END
--More code here...
IF @@ERROR<>0
BEGIN
RAISERROR('ANOTHER ERROR HERE. %s',16,1,@STORE_PROCEDURE_NAME)
GOTO ROLL
END
--more code here...
IF @@ERROR<>0
BEGIN
RAISERROR('MAIN ERROR %s',16,1,@STORE_PROCEDURE_NAME)
ROLL:
ROLLBACK TRANSACTION
RETURN
END
COMMIT TRANSACTION
答案 0 :(得分:1)
将Select-String
与这样的正则表达式一起使用:
IF .*\s+BEGIN([\s\S]*?)END
并从结果中仅选择组:
... | Select-String 'IF .*\s+BEGIN([\s\S]*?)END' -AllMatches |
Select-Object -Expand Matches |
Select-Object -Expand Groups |
Where-Object { -not $_.Groups } |
Select-Object -Expand Value
正则表达式匹配关键字IF
,后跟空格和同一行上的可选其他文本,一个或多个空白字符,关键字BEGIN
和最短文本量(非贪婪匹配)直到下一次出现关键字END
。 BEGIN
和END
之间的子表达式与括号分组,因此可以从完整匹配中提取。
答案 1 :(得分:0)
使用以下正则表达式/(If @@ERROR<>0\s+BEGIN)(.*?)(end)/sig
,我可以获得IF和END之间的内容。请注意,只匹配中间的END,所以实际上匹配某些块的BEGIN的END。