法个理想情况下的:
--创建测试环境
create table A
(
  a int,b int,c varchar(20)
)
insert A select 12,33,'44,55,66'--测试
declare @sql varchar(200)
declare @tmp int
declare @str varchar(20)
set @sql=''
select @str=c,@tmp=charindex(',',c) from A
while @tmp<>0
  begin
      set @sql=@sql+'select '''+substring(@str,1,@tmp-1)+''' [c] union '
      set @str=stuff(@str,1,@tmp,'')
      set @tmp=charindex(',',@str)
  end
set @sql=@sql+' select '''+@str+''' [c] '
set @sql='select A.a,A.b,B.c from A right join ('+@sql+') B on 1>0'
--print @sql
exec(@sql)--删除测试环境
drop table A--结果
/*
(1 row(s) affected)a           b           c    
----------- ----------- ---- 
12          33          44
12          33          55
12          33          66
*/

解决方案 »

  1.   

    备注一下:SUBSTRING ( expression , start , length ) 参数
    expression是字符串、二进制字符串、text、image、列或包含列的表达式。不要使用包含聚合函数的表达式。start是一个整数,指定子串的开始位置。length是一个整数,指定子串的长度(要返回的字符数或字节数)。STUFF ( character_expression , start , length , character_expression ) 参数
    character_expression由字符数据组成的表达式。character_expression 可以是常量、变量,也可以是字符或二进制数据的列。start是一个整形值,指定删除和插入的开始位置。如果 start 或 length 是负数,则返回空字符串。如果 start 比第一个 character_expression 长,则返回空字符串。length是一个整数,指定要删除的字符数。如果 length 比第一个 character_expression 长,则最多删除到最后一个 character_expression 中的最后一个字符。CHARINDEX ( expression1 , expression2 [ , start_location ] ) 参数
    expression1一个表达式,其中包含要寻找的字符的次序。expression1 是一个短字符数据类型分类的表达式。expression2一个表达式,通常是一个用于搜索指定序列的列。expression2 属于字符串数据类型分类。start_location在 expression2 中搜索 expression1 时的起始字符位置。如果没有给定 start_location,而是一个负数或零,则将从 expression2 的起始位置开始搜索。