2012-11-13 89 views
1

我在一個SQL表中有一些像text_en,text_es,text_de這樣的列。現在我想根據語言從一列中檢索值。 所以我創建了一個SQL字符串 SELECT @textfield FROM <table> 和VB代碼我用 cmd.AddWithValue("textfield", "text_" + lang) 但SQL返回列的名稱,而不是該列的值。我如何獲得價值?列名作爲參數

+0

我不認爲你必須改變表設計的能力,你呢?理想情況下,語言將規範化爲一個值,而不是單獨的語言列。這允許您稍後添加更多語言而不更新表格模式,並且還允許更好的查詢,即'select * from

where language = @ language''。 –

回答

2

你也可以做

SELECT CASE @textfield 
     WHEN 'text_en' THEN text_en 
     WHEN 'text_es' THEN text_es 
     WHEN 'text_de' THEN text_de 
     END AS local_text 
FROM TableName 
+0

+1 - 沒有動態的sql涉及 – Lamak

+0

這種方法也在做這個竅門。特別是在我的情況下,因爲case-when-else結構涵蓋了任何未預測的lang字符串的事實 – Makis

1

不要將它作爲參數傳遞,請將其作爲字符串文字傳遞。你的SQL語句應該是如下形式:

string col1name = 'somename'; 
string sql = 'SELECT ' + col1name + ' FROM TableName'; 

但如果你有傳遞到WHERE第一個參數,你應該把它作爲像你在你的問題做了什麼的參數。

請注意:您的查詢,這種方式容易受到SQL Injection的影響。在你的情況下,你可以將你的級聯SQL語句傳遞給存儲過程,然後使用sp_executesql而不是EXEC()

+1

SQL注入,任何人? – Oded

+0

謝謝大家。馬哈茂德,你拯救我的一天! – Makis

+0

@Makis - 非常謹慎地做這件事。它對[SQL注入](http://en.wikipedia.org/wiki/SQL_injection) – Oded

1

無論如何,你不能使用變量是SQL中的列名,而不是這樣。

您需要使用動態SQL才能指定像這樣的列名稱。

我建議您閱讀The Curse and Blessings of Dynamic SQL以瞭解該主題的綜合治療方法。

+0

thnx爲鏈接:) – Sohail