Tsql 困难的T-SQL编程任务

Tsql 困难的T-SQL编程任务,tsql,stored-procedures,sql-server-2000,Tsql,Stored Procedures,Sql Server 2000,我在SQLServer2000中遇到了一个棘手的编程问题,希望能得到帮助。我是T-SQL的新手(我主要使用MySQL),所以也许有人可以看看这个,并找到一个简单的方法 我有一个表,其中有许多列包含0或1。例如,我有标签为var1、var2、var5、var9的列。等等。总共大约有120列。请注意,这些列上的后缀不一定是连续的。这些列中的每一列都包含一个0或1。我需要做的是创建一个新列,该列包含每个包含1的列的文字列名 例如,我的数据如下所示: ID var1 var2 var5 v

我在SQLServer2000中遇到了一个棘手的编程问题,希望能得到帮助。我是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
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
我需要一个包含这些值的新列

ID  NewCol
---------------------
1   var2,var9
2   var2,var5,var7
等等

由于一些原因,我不能使用任何客户端代码,如VB、Perl等。我必须在存储过程中这样做。由于大量的列可能会在名称或数字上发生更改,因此我需要的不是一系列硬编码的SELECT CASE语句

我觉得我的T-SQL知识真的很有限。这能做到吗


TIA

您可以使用如下查询来完成此操作:

ID var1   var2   var5    var7   var9
--------------------------------------
1    0      1      0      0       1
2    0      1      1      1       0
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)
declare@SQL varchar(8000)
设置@SQL=''
选择@SQL=@SQL+'+case'+COLUMN_-NAME+'当1时,然后选择“”,“+COLUMN_-NAME+''else''end'
从信息_SCHEMA.COLUMNS
其中TABLE_NAME='YourTable'和
列名称“ID”
set@SQL='从您的表中选择ID,stuff('+stuff(@SQL,1,3',)+',1,1','')
exec(@SQL)

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

ID var1   var2   var5    var7   var9
--------------------------------------
1    0      1      0      0       1
2    0      1      1      1       0
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)
declare@SQL varchar(8000)
设置@SQL=''
选择@SQL=@SQL+'+case'+COLUMN_-NAME+'当1时,然后选择“”,“+COLUMN_-NAME+''else''end'
从信息_SCHEMA.COLUMNS
其中TABLE_NAME='YourTable'和
列名称“ID”
set@SQL='从您的表中选择ID,stuff('+stuff(@SQL,1,3',)+',1,1','')
exec(@SQL)

太棒了!这个解决方案正是我想要的。先生,我欠你的债。非常感谢。明亮的这个解决方案正是我想要的。先生,我欠你的债。非常感谢。