給個例子給你參考一下...自已看懂了,就會得到結果了... ------------------------------------------------------------ use pubs if exists(select * from sysobjects where name='Tb' and xtype='U') drop table Tb if exists(select * from tempdb..sysobjects where name like'#tmp%') drop table #tmp -------生成表及表内数据------------- CREATE TABLE Tb(a int ,b varchar(100)) INSERT TB SELECT 9258,'LBQR|LB' UNION ALL SELECT 888,'CCC' UNION ALL SELECT 92587, 'A|19|1' SELECT * FROM Tb GO --表变量@Tbl 保存分解后的结果集 --临时表#tmp 用于临时计算 Declare @Tbl table(a int ,b varchar(100)) --用来存放结果--按是否需要分隔将表分类两类(B字段是否包含'|') INSERT INTO @Tbl SELECT * FROM TB WHERE b NOT LIKE '%|%' --将无须分隔的放入结果集@TB SELECT * INTO #TMP FROM TB WHERE b LIKE '%|%' --需要分隔分隔的,暂存临时表,用于运算--对需要分折的记录进行运算 WHILE EXISTS(SELECT * FROM #TMP WHERE B LIKE '%|%') BEGIN --从左向右取出分隔符之前的数据,写入至结果集@Tbl;并截掉|之前的数据 insert into @Tbl select a,left(b,charindex('|',b,1)-1) from #tmp update #tmp set b=right(b,len(b)-charindex('|',b,1)) --如果进行如上操作后,剩余字符串无法分隔时追加到结果集@Tbl;同时在临时表中删除这部分数据 insert into @Tbl select * from #tmp where b not like '%|%' Delete #Tmp where b not like '%|%' ENDselect * from @Tbl order by a GO --删除临时用表 DROP TABLE Tb,#tmp
原表: a b ----------- ---------------------------------------------------------------------------------------------------- 9258 LBQR|LB 888 CCC 92587 A|19|1使用上述語句分拆後的:a b ----------- ---------------------------------------------------------------------------------------------------- 888 CCC 9258 LBQR 9258 LB 92587 19 92587 1 92587 A(所影响的行数为 6 行)
declare @sql nvarchar(4000) set @sql='''1'',''2'',''3'',''4'',''5''' set @sql=N'select ''行''+col,col [列1] from (select '+replace(@sql,',',N' [col] union all select ')+') a' exec (@sql) /* 列1 ---- ---- 行1 1 行2 2 行3 3 行4 4 行5 5 */
------------------------------------------------------------
use pubs
if exists(select * from sysobjects where name='Tb' and xtype='U') drop table Tb
if exists(select * from tempdb..sysobjects where name like'#tmp%') drop table #tmp
-------生成表及表内数据-------------
CREATE TABLE Tb(a int ,b varchar(100))
INSERT TB SELECT 9258,'LBQR|LB'
UNION ALL SELECT 888,'CCC'
UNION ALL SELECT 92587, 'A|19|1'
SELECT * FROM Tb
GO
--表变量@Tbl 保存分解后的结果集
--临时表#tmp 用于临时计算
Declare @Tbl table(a int ,b varchar(100)) --用来存放结果--按是否需要分隔将表分类两类(B字段是否包含'|')
INSERT INTO @Tbl SELECT * FROM TB WHERE b NOT LIKE '%|%' --将无须分隔的放入结果集@TB
SELECT * INTO #TMP FROM TB WHERE b LIKE '%|%' --需要分隔分隔的,暂存临时表,用于运算--对需要分折的记录进行运算
WHILE EXISTS(SELECT * FROM #TMP WHERE B LIKE '%|%')
BEGIN
--从左向右取出分隔符之前的数据,写入至结果集@Tbl;并截掉|之前的数据
insert into @Tbl select a,left(b,charindex('|',b,1)-1) from #tmp
update #tmp set b=right(b,len(b)-charindex('|',b,1))
--如果进行如上操作后,剩余字符串无法分隔时追加到结果集@Tbl;同时在临时表中删除这部分数据
insert into @Tbl select * from #tmp where b not like '%|%'
Delete #Tmp where b not like '%|%'
ENDselect * from @Tbl order by a
GO
--删除临时用表
DROP TABLE Tb,#tmp
a b
----------- ----------------------------------------------------------------------------------------------------
9258 LBQR|LB
888 CCC
92587 A|19|1使用上述語句分拆後的:a b
----------- ----------------------------------------------------------------------------------------------------
888 CCC
9258 LBQR
9258 LB
92587 19
92587 1
92587 A(所影响的行数为 6 行)
declare @sql nvarchar(4000)
set @sql='''1'',''2'',''3'',''4'',''5'''
set @sql=N'select ''行''+col,col [列1] from (select '+replace(@sql,',',N' [col] union all select ')+') a'
exec (@sql)
/*
列1
---- ----
行1 1
行2 2
行3 3
行4 4
行5 5
*/