2010-08-10 83 views
1

我在SQL 2005表中拥有如下数据。动态地使用动态列名生成where子句

 
Table Name: FilterData 
CategoryID ColumnID AnswerCode 
-------------------------------- 
0349  Q15  02 
0349  Q15  03 
0349  Q16  04 
 
Table Name: TransactionData 
CategoryID Q15 
--------------------------------- 
0349  01 
0349  02 
0349  03 
0349  04 
0349  05 
0349  06 

筛选数据表中有关于将用于过滤的TransactionData select语句哪些列的信息。所以当我从TransactionData执行Select *时,我想从FilterData表中创建Where子句,以便我可以在TransactionData表上为它启用该CategoryID。

有人可以帮助我,我该怎么做?

+0

不是真的明白你想要建立什么吗? – Shlomo 2010-08-10 14:58:11

回答

2

如果我正确理解你的问题,下面的代码应该工作。请注意,我创建了一个函数来帮助字符串连接。我不确定你是否想要和或或你的条件。我在我的示例中使用了AND。如果合适,您可以轻松调整它。

/* Set up sample data */ 
create table FilterData (
    CategoryID char(4), 
    ColumnID char(3), 
    AnswerCode char(2) 
) 

insert into FilterData 
    (CategoryID, ColumnID, AnswerCode) 
    values 
    ('0349','Q15','02') 
insert into FilterData 
    (CategoryID, ColumnID, AnswerCode) 
    values 
    ('0349','Q15','03') 
insert into FilterData 
    (CategoryID, ColumnID, AnswerCode) 
    values 
    ('0349','Q16','04') 
go 

/* Helper function to concatenate all AnswerCodes for a given ColumnID */ 
create function dbo.fnStringAnswerCodes(@ColumnID char(3)) 
returns varchar(1000) 
as 
begin 
    declare @CodeString varchar(1000) 
    set @CodeString = @ColumnID + ' in (' 

    select @CodeString = @CodeString + '''' + AnswerCode + ''',' 
     from FilterData 
     where ColumnID = @ColumnID 

    /* Remove trailing comma and add closing parens */ 
    select @CodeString = left(@CodeString, len(@CodeString)-1) + ')' 

    return @CodeString 
end 
go 

declare @CategoryID char(4) 
declare @SQLString varchar(1000) 
declare @WhereClause varchar(1000) 

set @CategoryID = '0349' 
set @SQLString = 'select * from TransactionData ' 
set @WhereClause = 'where CategoryID=''' + @CategoryID + ''' and ' 


select @WhereClause = @WhereClause + dbo.fnStringAnswerCodes(ColumnID) + ' and ' 
    from FilterData 
    where CategoryID = @CategoryID 
    group by ColumnID 

/* Remove Trailing 'AND' */ 
set @WhereClause = LEFT(@WhereClause, len(@WhereClause)-3) 

set @SQLString = @SQLString + @WhereClause 
select @SQLString 

/* Last step would be to dynamically execute the string we built */ 
/* exec sp_ExecuteSQL @SQLString */ 

/* Clean Up */ 
drop function dbo.fnStringAnswerCodes 
drop table FilterData 
+0

这是我见过的最棒的答案。我仍然试图理解这到底是什么,但它给了我我想要的。非常感谢答案。真的很感激,很多。 – Asdfg 2010-08-11 11:16:48

+0

真棒答案是我的专长! :-) 很高兴我能帮上忙。 – 2010-08-11 13:01:32

0

这是上述条件的where子句。然而,你需要澄清你的意思是动态的吗?你是否会收到两套两项标准 - 即(Q15和'02','03')和('Q16'和'04')?此外,您应该使这些查询参数防止SQL注入。

ColumnID的= 'Q15' 和AnswerCode IN('02' , '03')

OR

ColumnId ='Q16'和AnswerCode IN('04')

+0

我无法指定ColumnId ='Q15'和AnswerCode IN('02','03'),因为它将来自FilterData表,因此它必须以字符串形式动态生成。 FilterData表的ColumnID字段中的数据实际上是其他表的列名,AnswerCode是我想要过滤的值。 – Asdfg 2010-08-10 18:26:58