启用或禁用部分TSQL select语句(列)

时间:2013-01-15 06:40:53

标签: tsql

假设我有一个包含五列的表格。完整选择语句将是:

Select col1, col2, col3, col4, col5 
from tbl

但是我需要这个查询是“动态的”,每列都必须能够启用/禁用。所以,据我所知,我需要五个标签(bool让我们说)。 如果我有tag1=0, tag2=1, tag3=1, tag4=0, tag5 =0那么select语句应该是这样的:

Select col2, col3 
from tbl

如果我有tag1=1, tag2=0, tag3=0, tag4=0, tag5 =0,那么select语句应该是这样的:

Select col1 
from tbl

那么有可能在TSQL中这样做吗?我打算创建SP并从php执行它。

P.S。我知道有一个解决方案可以使一系列IF语句包含所有可能的tag1...tag5变体,但是当列数(和启用标记)很高时,这不是很有效。

2 个答案:

答案 0 :(得分:1)

create procedure GetTblList
  @Tag1 bit,
  @Tag2 bit,
  @Tag3 bit,
  @Tag4 bit,
  @Tag5 bit
as

declare @SQL nvarchar(max)
set @SQL = 'select '

if @Tag1 = 1 set @SQL = @SQL + 'Col1,'
if @Tag2 = 1 set @SQL = @SQL + 'Col2,'
if @Tag3 = 1 set @SQL = @SQL + 'Col3,'
if @Tag4 = 1 set @SQL = @SQL + 'Col4,'
if @Tag5 = 1 set @SQL = @SQL + 'Col5,'
if @SQL = 'select ' set @SQL = @SQL + 'null as NoColumnSelected'

set @SQL = stuff(@SQL, len(@SQL), 1, ' from TbL')
exec (@SQL)

答案 1 :(得分:0)

即使很难,这不是推荐的做法,唯一可行的方法似乎是将sql语句创建为字符串并执行它。

如果在应用程序层中构建sql语句字符串,则可以将其发送到db层以作为单个字符串执行。这一点应该清楚。

另一方面,如果要在DB级别(例如在SP中)构建sql语句字符串,则可以使用sp_executesql存储过程来执行它。样品:

DECLARE @sql nvarchar(MAX); 
SET @sql = 'SELECT col1' 
IF @tag1 = 1 SET @sql = @sql + ', dynamic_col_1'; 
IF @tag2 = 1 SET @sql = @sql + ', dynamic_col_2'; 
IF @tag3 = 1 SET @sql = @sql + ', dynamic_col_3'; 
SET  @sql = @sql + ' FROM myTable' 
EXEC sp_executesql @sql;  

无论哪种情况,您都需要将所有标签作为参数发送,或者您可以将它们聚合成一个5位数的字符串参数,其中每个数字代表一个标志。