2009-12-12 40 views
1

爲什麼在SQL Server中不允許使用表參數?有沒有解決這個問題的方法?SQL表參數

實施例:

using (SqlCommand myCommand = new SqlCommand("SELECT * FROM @table WHERE [email protected] AND PASSWORD=HASHBYTES('SHA1', 
@password)", myConnection)) 
    { 
     myCommand.Parameters.AddWithValue("@table", table); 
     myCommand.Parameters.AddWithValue("@username", user); 
     myCommand.Parameters.AddWithValue("@password", pass); 

     myConnection.Open(); 
     SqlDataReader myReader = myCommand.ExecuteReader()) 
     ................... 
    } 

感謝。

回答

3

您不能參與SQL的這一部分。服務器需要知道表的名稱,以便能夠「準備」查詢,這是在處理參數之前完成的。

您可能會動態生成查詢,但這可能會導致SQL注入攻擊和運行時SQL語法錯誤。另外,如果服務器可以緩存一條SQL語句,則可以節省一些時間 - 如果每個查詢都是動態生成的,那麼您就會發現這種情況。

0

,您不能將表名作爲參數傳遞。

最好的辦法是嘗試使用String.Format作爲表名。

1

如果你必須通過值的表...

否則,您要做什麼?

編輯:我已經知道了。正如其他人提到的,SQL不能像那樣工作。

1

爲什麼?因爲與在查詢優化和驗證中創建的噩夢相比,靈活性的好處是微不足道的。

作爲旁註,即使它被識別出來,你會在SQL中獲取帶引號的字符串,而不僅僅是表名。動態SQL與大量驗證是唯一真正做到這一點的方法。

0

我想嘗試ilustrate我的觀點大約用一個例子:

如果你去買車,你可以在「參數多態」一些認爲:你可以改變顏色,可能是一些變化引擎,你可以放一個MP3或不...,但你不能改變汽車模型。如果你改變車型,這不是一個參數,這是另一輛車。

這與sql查詢是一樣的,表不是一個參數是句子本身的一部分,與命令相同的方式是(select,update)..所以你不能從@table中執行@command。如果你改變表格,這是另一個句子,就像汽車。

(這不是一個技術性的「因爲」回答你的問題,但從更好地瞭解別人是張貼介紹技術部分的概念點)

我的兩分錢。