2013-05-20 37 views
0

我對使用SQL查詢參數有些困惑,並且發現了一些我無法立即解釋的東西,所以我只是在此後的一些背景信息之後。SQL參數 - 擴展發生在哪裏

首先,查詢中是否有參數名稱的標準格式,還是依賴於此數據庫/中間件?我已經看到了這兩者: -

DELETE * FROM @tablename  

和...

DELETE * FROM :tablename 

二 - 在哪裏(典型值)不參數替換髮生的呢?在查詢發送到數據庫之前,參數是否被替換/擴展?或者數據庫是否單獨接收參數和查詢,並自行執行擴展?

就像背景一樣,我使用C++ Builder應用程序中的DevArt UniDAC工具包通過ODBC連接到Excel電子表格。我知道這在幾個方面幾乎是pessimal ...(我試圖瞭解爲什麼一個特定的命令只有當它使用參數)

+0

不好的例子:你通常不能使用參數作爲表本身的名字。 –

+0

@JoelCoehoorn - 如果我使用了'更好'的例子,沒有人會告訴我我的實際問題是什麼! – Roddy

回答

0

SQL參數發送到數據庫。數據庫本身執行擴展。這允許數據庫設置一個查詢計劃,該計劃將針對不同的參數值起作用。

Microsoft始終使用@parname作爲參數。 Oracle使用:parname。其他數據庫是不同的。

沒有我知道的數據庫允許你指定表名作爲參數。您必須展開該客戶端,如:

command.CommandText = string.Format("DELETE FROM {0}", tableName); 

P.S. DELETE之後不允許有*。畢竟,你只能刪除整行,而不是一組列。

+0

謝謝。 DELETE *似乎確實有效,但我知道這不是必須的。我認爲params的主要優點是避免SQL注入 - 所以表名不被支持似乎很奇怪? – Roddy

+1

參數是爲性能而創建的。它們允許數據庫爲具有不同參數值的相同查詢做準備。如果它們是針對注入設計的,那麼它們會允許表名,列表後面的列,等等。 – Andomar

+0

表現是一個不錯的副作用。爲_security_創建參數,以絕對不受侵犯的方式防止sql注入攻擊。 –

2

有了這樣的數據訪問庫,如UniDACFireDAC,可以使用宏。它們允許您在SQL命令的參數不允許的地方使用特殊標記(稱爲宏)。我不知道UniDAC API,但將提供FireDAC樣本:

ADQuery1.SQL.Text := 'DELETE * FROM &tablename'; 
ADQuery1.MacroByName('tablename').AsRaw := 'MyTab'; 
ADQuery1.ExecSQL; 
+0

謝謝 - 我剛剛發現UniDAC宏。不過,他們似乎並沒有以防止注入攻擊的方式處理引號。 – Roddy

1

二 - 在哪裏(典型值)不參數替換髮生的呢?

它沒有。這就是整個問題。查詢中的數據元素保留數據項。代碼元素保留代碼元素。兩個從不相交,因此永遠不會有惡意數據被視爲代碼的機會。

通過ODBC連接到Excel電子表格......我試圖理解爲什麼一個特定的命令只當不使用參數

Excel是不是一個真正的數據庫引擎,但如果是這樣,你仍然不能使用表名的參數。

+0

..這解釋了爲什麼我在嘗試「查看」擴展的SQL以確保正確使用參數時遇到問題:它根本就不存在。 – Roddy