假設我想刪除一個名稱爲變量值的表,比如「#t」。如何安全地刪除具有變量名稱的表格?
SqlCommand cmd = new SqlCommand("drop table " + TableName); //Not safe
SqlCommand cmd = new SqlCommand("drop table [" + TableName +"]"); //Not safe
EXEC('drop table [' + @tablename +"]"); --Not safe
以上都不是安全的SQL注入,那麼有什麼選擇?
人們說「你必須使用動態SQL」,但是這些例子通常還是像上面第三個例子那樣涉及到不安全的連接。
與我能找到的答案最接近的地方(https://stackoverflow.com/a/14026855/88409)基本上說你必須自己檢查一下,並且沒有辦法繞過它(例如,通過解析或從可信來源獲取變量來確保變量是有效的) ,但我對這個答案並不滿意。
背景:我構建了一個名爲TempIDTable的C#類,其構造函數接受SqlConnection和一個整數列表。它會生成一個具有給定名稱的臨時表,可選地使用行號列,並執行批量插入的ID。你可以將整個東西包裝在C#中的使用塊中,而dispose方法處理掉表格。在使用塊中,可以使用常規的SqlCommand選擇語句與id列上的臨時表連接來選擇所需的記錄,並且在處理大量的id列表時,其速度比以任何其他方式快得多。 – Triynko
該類爲名稱使用了一個常量「#s」,但我想讓表名變成一個變量,並且爲了確保drop語句不會因爲程序員錯誤或其他原因而行爲不當,我想強制執行規則表名必須是有效/帶引號的表名,另外它必須是以'#'開頭的臨時表。 – Triynko
僅供參考......當連接關閉時,臨時表會自動刪除。請參閱此頁上的「臨時表」段落:http://technet.microsoft.com/en-us/library/ms174979.aspx – David