0

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

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

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

Select col2, col3 
from tbl

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

Select col1 
from tbl

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

Ps 我知道有一种解决方案可以制作一堆IF具有所有可能变化的语句tag1...tag5,但是当列数(和启用标签)很高时,这不是很有效。

4

2 回答 2

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)
于 2013-01-15T07:10:08.330 回答
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 位字符串参数,其中每个数字代表一个标志。

于 2013-01-15T07:13:30.550 回答