2012-04-03 38 views
4

問:匹配SQL對象(表/函數/視圖)的正則表達式模式?

給出一個SQL字符串像

CREATE VIEW TestView AS 
SELECT value1, value2 
FROM TABLE_0 
UNION 
(SELECT * FROM TABLE_2) AS value1 
,value2 
FROM TABLE_12 
UNION 
SELECT * FROM TABLE_3 

(小寫)

和String一樣

string[] tables = new string[]{"table_1", "table_2", "table_3"} 

現在,我做了一個數組:

if (strViewDefinition.Contains(strObjectName)) // aaaaargh 

爲表中的每個strObjectName檢查視圖是否依賴於此對象。

但這未能對table_12(和循環依賴的結果),例如,因爲表中包含「TABLE_1」。 Aaargh。

我需要一個正則表達式,可以檢查視圖定義包含一個函數名,表值函數或另一種觀點認爲...

( 對於 System.Text.RegularExpressions.Regex.IsMatch檢查( )

我的審判是:

string whateverneedsescaping= System.Text.RegularExpressions.Regex.Escape(@"+-*\/%=,\n\r"); 
string fieldsep = @"[\s\n\r," + whateverneedsescaping+ "]*"; 
string strPattern = fieldsep + "VIEW/FUNCTION_NAME" + fieldsep; 

但是失敗了,再加上它沒有考慮對象名稱加上方括號,如

"[TABLE_NAME]" 

任何人都可以幫忙嗎?

+0

@馬克·班尼斯特:是的,這是SQL-Server中。但SQL-Server 2005. Plus也適用於其他Db系統,因此不建議我使用SMO(SQL 2005上的bug也是順便說一句);-) – 2012-04-03 09:02:54

回答

0

這做工作:

string strSchema = "dbo"; 
string strRegexObjectName = System.Text.RegularExpressions.Regex.Escape(strObjectName); 
string strPattern = @"[\s\+\-\(,/%=\*\\](\[?" + strSchema + @"\]?\.)?\[?" + strRegexObjectName + @"\]?([\s\+\-\),/%=\*\\]|$)"; 
1

表達式\bname\b是否足夠? \bword boundary

例如\btable_1\b將不匹配table_12

如果你有,你可以與像\b(?:foo|bar|baz)\b表達式一起檢查所有這些許多名字。

+0

它比這個(字邊界)更復雜一些,但感謝所有這一切的建議。 – 2012-04-03 12:12:54

2

我認爲它不工作的原因是因爲你有你的一套-字符。這個字是不是Regex.Escape逃脫等字符集結束了包含以下內容:

[\s\n\r,\+-\*\\/%=,\\n\\r] 

-在這組嘗試創建文字字符+*不作任何意義之間的範圍因此它會通過消息[x-y] range in reverse order引發ArgumentException。

雖然我敢肯定不是100%我明白您的具體要求,我認爲有關使用單詞邊界從Qtax的建議是可行的。

所有我想補充的是,你可以解釋,改成與[]環繞表名:

\[?\btable_1\b]? 
+0

哦,地獄,謝謝你的減號/破折號! – 2012-04-03 12:05:22

+0

@Quandary樂於幫助:) – Robbie 2012-04-03 13:28:35