2011-03-08 86 views
4

好的,這是我的情況,我有一個我想要傳入存儲過程的變量列表。每個變量表示數據庫中的一列(dbImage)並且是布爾型的。將列表傳入存儲過程

--Columnslist contains Var1, Var2, Var3 
@ColumnsList varchar(Max) 

我想將它們傳遞到select語句和VAR1,VAR2和VAR3爲真

SELECT @ColumnsList from dtImage WHERE @ColumnsList = True 

我知道這可能是混亂的,我知道我想要做的。我很難解釋我想做什麼。

+0

我不確定,但它聽起來像你可能想要看看動態sql ...你是否想要選擇列名稱的變量列表? – FrustratedWithFormsDesigner 2011-03-08 15:41:55

+0

什麼'WHERE @ColumnsList = True'甚至意味着什麼? – 2011-03-08 15:45:29

+0

@ColumnsList =「var1,var2,var3」我想要比較@ColumnsList中的每個var,其中每個var = true。這就是我的意思是 – 2011-03-08 16:37:17

回答

1

執行它你的意思是假設你有一個表,如下所示

CREATE TABLE bits 
(
id INT PRIMARY KEY, 
col1 BIT, 
col2 BIT, 
col3 BIT, 
col4 BIT 
) 

填充的如下

INSERT INTO bits 
VALUES (1,0,0,0,0), 
     (2,1,1,1,1), 
     (3,1,1,0,0) 

而你通過字符串

DECLARE @ColumnsList VARCHAR(MAX) = 'col1,col2,col3' 

您想獲得第2行,因爲這是唯一一個所有這些列的值爲1

如果可能動態SQL或某種按位查詢將是最明智的解決方案。與此同時,這裏沒有一個解決方案。

SELECT id 
FROM bits UNPIVOT(val FOR col IN (col1, col2, col3, col4)) unpvt 
     JOIN (SELECT col 
      FROM (SELECT CAST('<c>' + REPLACE(@ColumnsList, ',', '</c><c>') + '</c>' AS XML) AS x) x 
        CROSS APPLY (SELECT t.split.value('.', 'sysname') AS col 
           FROM x.nodes('/c') t(split)) ca) cols 
     ON cols.col = unpvt.col 
GROUP BY id 
HAVING COUNT(CASE 
       WHEN val = 0 THEN 1 
      END) = 0 
+0

雅似乎動態sql是要走的路,我可以拉起數據的方式,但沒有得到如何寫一個基於它的聲明 – 2011-03-08 17:15:15

+1

@Joel - 但我有正確理解要求第一個地方?另外,如果您決定動態生成查詢,那麼在應用程序中執行查詢可能比在TSQL中重新分割字符串更好。 – 2011-03-08 17:44:32