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

启用或禁用TSQL select语句的一部分(列),tsql,Tsql,假设我有一个有五列的表。完整的select语句将是: 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 Select col1 from tbl 如果我有tag1=1、tag

假设我有一个有五列的表。完整的select语句将是:

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
Select col1 
from tbl
如果我有
tag1=1、tag2=0、tag3=0、tag4=0、tag5=0
,则select语句应如下所示:

Select col2, col3 
from tbl
Select col1 
from tbl
那么在TSQL中有这样做的可能性吗?我打算创建SP并从php执行它


另外,我知道有一种解决方案,可以使用所有可能的
tag1…tag5
变体生成一组
IF
语句,但当列数(和启用标记)增加时,这不是很有效很高。

即使很难,也不建议这样做。唯一可能的方法似乎是将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位数的字符串参数,其中每个数字表示一个标志。

仅通过使用动态SQL路由。SQL中的静态查询总是返回具有相同“形状”的结果集(列的数量以及每列的名称和类型都是固定的),感谢您提供的信息。正如我所料。