将列列表传递给存储过程

时间:2011-03-08 15:40:17

标签: sql-server-2008 stored-procedures

好的,这是我的情况,我有一个我希望传递给存储过程的变量列表。每个变量代表一个数据库中的列(dbImage)并且是布尔值。

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

我想将它们传递给select语句,将var1,var2和var3传递给true

SELECT @ColumnsList from dtImage WHERE @ColumnsList = True

我知道这可能令人困惑,我知道我想做什么。我只是很难解释我想做什么。

2 个答案:

答案 0 :(得分: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  

答案 1 :(得分:0)

您可以创建动态sql语句并使用sp_ExecuteSql执行它 http://msdn.microsoft.com/en-us/library/ms188001.aspx