假设我有一个包含五列的表格。完整选择语句将是:
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
变体,但是当列数(和启用标记)很高时,这不是很有效。
答案 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位数的字符串参数,其中每个数字代表一个标志。