使用动态列名动态生成where子句

时间:2010-08-10 14:56:04

标签: sql-server sql-server-2005 dynamic-sql

我在SQL 2005表中有数据如下。

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

FilterData表包含有关用于过滤TransactionData上的select语句的列的信息。因此,当我从TransactionData执行Select *时,我想从FilterData表构建Where子句,以便我可以在TransactionData表上为该CategoryID触发它。

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

2 个答案:

答案 0 :(得分:2)

如果我理解你的问题,下面的代码应该有效。请注意,我已经创建了一个函数来帮助字符串连接。我不确定你是否想和你或你的条件。我在我的样本中使用了AND。如果合适,您可以轻松地将其调整为OR。

/* 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

答案 1 :(得分:0)

这是上述标准的where子句。但是,您需要通过动态阐明您的意思吗?你会收到2套两个标准 - 即(Q15和'02','03')和('Q16'和'04')?此外,您应该使用这些查询参数来阻止SQL注入。

哪里

ColumnId ='Q15'和AnswerCode IN('02','03')

OR

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