问题描述:有特定环境下,我们也许只知道某一列(或几列),而想获得除此列(几列)外的所有列的数据。
如已知如下circle表
可能只知道有一列(flag),欲获得除此列之外的数据。
预期结果如下:
解决方案:
将问题进行分解:
1.获取除此列外所有列的名称;
2.利用动态SQL,得到预期结果。
获取所有列名的方法:
方法一:
select name from syscolumns
where id = object_id('circle')
方法二:
select column_name
from information_schema.columns
where table_name = 'circle'
对应上述二种获取列名的方法,便存在二种不同的解决方案。
方案一:
declare @columnNames varchar(max)
set @columnNames = ''
select @columnNames = @columnNames + name +','
from syscolumns
where id = object_id('circle') and name <>'flag'
--erase the last comma
set @columnNames = substring(@columnNames,1,len(@columnNames)-1);
exec('select ' + @columnNames +' from circle');
方案二:
declare @columnNames varchar(max)
set @columnNames = ''
select @columnNames = @columnNames+column_name +','
from information_schema.columns
where table_name = 'circle' and column_name <>'flag'
--erase the last comma
set @columnNames = substring(@columnNames,1,len(@columnNames)-1);
exec('select ' + @columnNames +' from circle');
结论:
这种方式仅适用于特定条件下,如已知部分列的列名获取除已知部分列外的数据。因为这种方式本身效率不高,所以在已知所需列名时,不推荐使用这种方式获取数据,最好乖乖列出所有需要列的列名。