(转)SQL Server 列转行

原文:http://www.myexception.cn/sql-server/1078985.html
1,2,3,4,5
以上是一个字符串或则一逗号分隔的数字。

这里希望用一条语句查询出这样的效果:

1
2
3
4
5


不知道怎样才能实现
------解决方案--------------------
create function [dbo].[f_Split]
 (
 @SourceSql nvarchar(max),--源分隔字符串
 @StrSeprate varchar(10)--分隔符
 )
 returns @temp table(a nvarchar (max))
 as 
begin
     declare @i int
     set @SourceSql=rtrim(ltrim(@SourceSql))
     set @i=charindex(@StrSeprate,@SourceSql)
     while @i>=1
     begin
         insert @temp values(left(@SourceSql,@i-1))
         set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
         set @i=charindex(@StrSeprate,@SourceSql)
     end
     if @SourceSql<>'\'
        insert @temp values(@SourceSql)
     return 
end
go
select * from f_Split('1,2,3,4,5',',')
------解决方案--------------------
declare @str varchar(20)
set @str='1,2,3,4,5'
set @str=@str+','
while charindex(',',@str)>0
begin
  select substring(@str,1,charindex(',',@str)-1)
  set @str=substring(@str,charindex(',',@str)+1,len(@str))
end
------解决方案--------------------

CREATE TABLE T1(F1 VARCHAR(20))
INSERT INTO T1 VALUES('1,2,3,4,5')
SELECT x.T.value('.','varchar(10)') AS ID
FROM (SELECT CONVERT(XML,'<T>' + REPLACE(F1,',','</T><T>')+'</T>') AS K FROM T1) A
CROSS APPLY K.nodes('T') x(T)
-------- ID ---------- 1 2 3 4 5 (5 行受影响)

------解决方案--------------------
--cardbase
if object_id('cardbase','u') is not null
drop table cardbase
create table cardbase
(
[str] nvarchar(20)
)
go
--SQL declare @length int declare @start int declare @str nvarchar(20) set @str='1,2,3,4,5' set @length=LEN(@str) set @start=1 while(@start<=@length)
begin     insert into cardbase select SUBSTRING(@str,@start,1)
set @start=@start+2
end
select *From cardbase
--结果集
/*
1 2 3 4
5 */
posted @ 2017-09-06 10:01  禹过天晴  阅读(692)  评论(0编辑  收藏  举报