2016-01-30 54 views
-1

我試圖確保一些存儲過程不應該有RETURN語句,除了最後一個。對於這個任務,我試圖在我的PowerShell腳本上使用常規表達式。 我的策略是檢查每個IF @@ERROR<>0塊並在其中執行另一個搜索。如何匹配此SQL查詢的每個IF塊的內容?匹配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

你基本上是問如何捕捉之間IF @@ ERROR <> 0 BEGIN ...和END的東西嗎? –

+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,以及最短的文本(非貪婪匹配)直到下一次出現的關鍵字ENDBEGINEND之間的子表達式使用括​​號進行分組,因此可以從完整匹配中提取它。

0

用以下正則表達式/(If @@ERROR<>0\s+BEGIN)(.*?)(end)/sig我可以得到IF和END之間的內容。請注意,只匹配中間END,因此實際上與某些塊的BEGIN的END匹配。

DEMO CODE

相關問題