2009-02-09 87 views
1

我有一個包含10列的表,如col_1,col_2,.... col_10。我想編寫一個select語句,它將從這10列中的一列中選擇一行的值。我有一個變量,將決定從哪個列中選擇。這樣的查詢可以寫在列名是從一個變量動態決定的地方。SQL Server中的動態查詢

回答

1

由於我沒有足夠的細節,我不能給代碼。相反,我會解釋。

聲明一個字符串變量,像:

declare @sql varchar(5000) 

設置該變量是你想要完成的SQL字符串(字符串,而沒有實際查詢...所以你嵌入行名稱你希望使用字符串連接)。

然後調用:exec(@sql)

所有集。

+0

確保你正在採取適當的措施來防止sql注入。如果用戶可以爲列名輸入任意文本,那麼你會遇到很大麻煩。 – 2009-02-09 15:37:19

+0

這是一個很好的例子,說明爲什麼讓提問者決定哪個答案是「正確的」是一個壞主意。正確的答案(下面有很多關鍵點)是你不需要針對這種特殊情況的動態sql。如果你確實需要它,那麼這將是正確的答案。 – 2009-02-09 20:05:17

+1

我不同意。 這是一個很好的例子,流行情境是有偏見的。請求者詢問動態查詢,除此之外,我們並沒有意識到請求者真正需要它的內容。 證明正確的答案並不總是正確的答案。 – user54650 2009-02-09 21:38:54

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

我不知道你使用的是什麼平臺,但你可以很容易地使用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注入攻擊。

0

這不是你應該永遠需要做的,如果你的數據庫設計正確的東西。我會重新審視該模式元素的設計,以消除這種需要。