2010-11-20 25 views
2

早上好。如何確定SQL查詢是否是SELECT?

編輯

我想這樣做在SQL查詢一些驗證,以確認該查詢是一個SELECT而不是UPDATE或DELETE或INSERT或任何SQL語句怪異。

我知道最簡單的方法是匹配 「^ SELECT」,但是:

  • 查詢可以開始 「(」 像

    (SELECT * FROM等等WHERE ID> 1 LIMIT 3 )UNION(SELECT * ...)

  • 查詢可以啓動 「遞推式」

    與遞歸CTE AS(SELECT * FROM等等)

我想確定一個SQL查詢是否是一個SELECT。 嗯,我不知道在編寫正則表達式之前是否有一些奇怪的問題需要了解。

任何幫助表示讚賞。

編輯:我要檢查它是否是一個純Select查詢:)

+0

你試圖解析什麼味道的SQL?不同的供應商提供不同的語法和選項,儘管您的示例似乎是SQL Server上的CTE。 – Oded 2010-11-20 11:32:51

+0

它不能是供應商特定 – dzen 2010-11-20 11:38:38

+0

似乎它不是特定於SQL Server:http://www.davidcramer.net/code/django/6939/scaling-threaded-comments-on-django-at-disqus.html – dzen 2010-11-20 11:40:17

回答

1

您也可以在運行裏面自己的選擇,尋找出的數據進行更新,或者許多其他的方式嵌入報表更新statemtents into eachother ...假設你不使用「SELECT」作爲數據或字段名稱,只需運行/\bselect\b/i的正則表達式,否則你將需要一個完整的解析器。

編輯:另請參見:/\b(insert|update)\b/i反轉,以確保它們中沒有它們。

+0

不,這個請求必須是純粹的SELECT。我的意思是它不能是更新,插入或whatelse。 – dzen 2010-11-20 11:38:20

+0

好吧,您可以輕鬆地在select中添加插入更新或whatelse查詢...所以...只需運行帶有額外選項的'/ \ b(插入|更新)\ b/i'並反轉輸出即可。 – 2010-11-20 11:43:50

+3

以下技術上允許在SQL Server中創建表[insert]([update] int);插入[插入]值(1);從[插入]' – 2010-11-20 11:49:57

-1

如果查詢的單詞開始「選擇」(不區分大小寫),那麼這是一個選擇查詢

+1

中選擇[更新]不,如上所述,SELECT可以以「(SELECT)」開頭。我想知道是否還有更多的可能性。 – dzen 2010-11-20 12:00:18

1

正常的方式來處理,這是具有權限 - 授予用戶運行在SQL Server查詢db_reader權限,但不db_writer或其他任何東西。然後,如果查詢失敗,則處理錯誤/異常。