我有一個包含10列的表,如col_1,col_2,.... col_10。我想編寫一個select語句,它將從這10列中的一列中選擇一行的值。我有一個變量,將決定從哪個列中選擇。這樣的查詢可以寫在列名是從一個變量動態決定的地方。SQL Server中的動態查詢
1
A
回答
1
由於我沒有足夠的細節,我不能給代碼。相反,我會解釋。
聲明一個字符串變量,像:
declare @sql varchar(5000)
設置該變量是你想要完成的SQL字符串(字符串,而沒有實際查詢...所以你嵌入行名稱你希望使用字符串連接)。
然後調用:exec(@sql)
所有集。
11
是,使用CASE語句:
SELECT CASE @MyVariable
WHEN 1 THEN [Col_1]
WHEN 2 THEN [Col_2]
...
WHEN 10 THEN [Col_10]
END
這是否是一個好主意,完全是另外一個問題。您應該使用比Col_1,Col_2等更好的名稱。
您也可以使用其他人所建議的字符串替換方法。但是,這是最後的選擇,因爲它可以打開您的代碼到SQL注入攻擊。
3
聽起來像一個壞的,非規範化的設計給我。
我認爲一個更好的人會將該表作爲父項,並將包含外鍵的行包含到包含10行的單獨子表中,其中每行對應於您現在擁有的每個列。當在父表中插入或更新行時,讓父表根據該魔術值設置外鍵。
如果子表格相當靜態,這將工作。
1
我假設你純粹在Transact-SQL中運行。你需要做的是動態創建SQL變量作爲列名,並使用EXECUTE命令來運行它。例如:
EXECUTE('select ' + @myColumn + ' from MyTable')
0
您可以用T-SQL CASE語句做到這一點:
SELECT 'The result' =
CASE
WHEN choice = 1 THEN col1
WHEN choice = 2 THEN col2
...
END
FROM sometable
0
恕我直言,Joel Coehoorn's case statement可能是最好的主意
...但如果你真的有使用動態SQL,你可以做到這一點sp_executeSQL()
0
我不知道你使用的是什麼平臺,但你可以很容易地使用Dynamic LINQ來做到這一點。
var query = context.Table
.Where(t => t.Id == row_id)
.Select("Col_" + column_id);
IEnumerator enumerator = query.GetEnumerator();
enumerator.MoveNext();
object columnValue = enumerator.Current;
據推測,您將知道根據列將其轉換爲哪種實際類型。關於這一點的好處是您可以免費獲得參數化查詢,從而保護您免受SQL注入攻擊。
3
爲人們尋找做動態SQL好文章:
0
這不是你應該永遠需要做的,如果你的數據庫設計正確的東西。我會重新審視該模式元素的設計,以消除這種需要。
相關問題
- 1. 動態查詢SQL Server
- 2. SQL Server中的動態查詢中的嵌套查詢
- 3. SQL Server 2008的動態查詢疑問
- 4. 動態查詢中的子查詢SQL Server 2008
- 5. SQL Server - 動態數據透視查詢
- 6. SQL SERVER 2008動態查詢問題
- 7. 如何在SQL Server中使用動態查詢執行sql
- 8. 在SQL Server 2005中編寫動態SQL查詢
- 9. 動態SQL查詢
- 10. 動態SQL查詢
- 11. 動態SQL查詢
- 12. 動態SQL查詢
- 13. SQL Server不允許執行子查詢的動態SQL
- 14. 定義動態PIVOT SQL查詢的SQL Server
- 15. 值沒有傳遞給sql server中的動態查詢
- 16. 顯示動態查詢中每列的別名SQL Server
- 17. 使用動態查詢SQL Server中的變量
- 18. 如何使用SQL Server 2012中的動態列進行查詢
- 19. 在SQL Server中動態查詢的存儲過程
- 20. PHP - 動態POST的動態SQL查詢
- 21. Sql Server中的sysprocesses查詢
- 22. SQL Server中的XML查詢
- 23. SQL Server查詢
- 24. SQL Server查詢?
- 25. SQL Server查詢
- 26. SQL Server查詢
- 27. SQL Server查詢
- 28. SQL Server查詢
- 29. SQL Server查詢
- 30. SQL Server查詢
確保你正在採取適當的措施來防止sql注入。如果用戶可以爲列名輸入任意文本,那麼你會遇到很大麻煩。 – 2009-02-09 15:37:19
這是一個很好的例子,說明爲什麼讓提問者決定哪個答案是「正確的」是一個壞主意。正確的答案(下面有很多關鍵點)是你不需要針對這種特殊情況的動態sql。如果你確實需要它,那麼這將是正確的答案。 – 2009-02-09 20:05:17
我不同意。 這是一個很好的例子,流行情境是有偏見的。請求者詢問動態查詢,除此之外,我們並沒有意識到請求者真正需要它的內容。 證明正確的答案並不總是正確的答案。 – user54650 2009-02-09 21:38:54