困难的T-SQL编程任务

时间:2012-01-12 06:34:00

标签: tsql stored-procedures sql-server-2000

我在SQL Server 2000中遇到了一个棘手的编程问题,我希望能得到帮助。我是T-SQL的新手(我主要使用MySQL)所以也许有人可以看看这个并看到一个简单的方法来做到这一点。

我有一个包含许多列的表,其中包含0或1.例如,我有标记为var1, var2, var5, var9的列。最多约120列。请注意,这些列上的后缀不一定是连续的。这些列中的每一列都包含0或1.我需要做的是创建一个新列,其中包含每个包含1的列的文字列名。

例如,我的数据如下所示:

ID var1   var2   var5    var7   var9
--------------------------------------
1    0      1      0      0       1
2    0      1      1      1       0

我需要一个包含值

的新列
ID  NewCol
---------------------
1   var2,var9
2   var2,var5,var7

等等。

由于我不能进入的原因,我无法使用任何客户端代码,如VB,Perl等。我必须在存储过程中执行此操作。由于可以更改名称或数字的大量列,我需要的不是一系列硬编码的SELECT CASE语句。

我觉得我的T-SQL知识非常有限。可以这样做吗?

TIA

1 个答案:

答案 0 :(得分:4)

您可以使用如下所示的查询执行此操作:

select ID,
       stuff(
       case var1 when 1 then ',var1' else '' end +
       case var2 when 1 then ',var2' else '' end +
       case var5 when 1 then ',var5' else '' end +
       case var7 when 1 then ',var7' else '' end +
       case var9 when 1 then ',var9' else '' end
       , 1, 1, '')
from YourTable

这是一种动态构建它的方法。

declare @SQL varchar(8000)
set @SQL = ''

select @SQL = @SQL + ' + case '+COLUMN_NAME+' when 1 then '','+COLUMN_NAME+''' else '''' end'
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = 'YourTable' and
      COLUMN_NAME <> 'ID'

set @SQL = 'select ID, stuff('+stuff(@SQL, 1, 3, '')+', 1, 1, '''') from YourTable'

exec(@SQL)