用一個字符串來描述一個表的內(nèi)容,需要時用這個表值函數(shù)將其還原成一個表。
由于無法預(yù)知表的列數(shù)量和列名,需要使用時進行 【行列轉(zhuǎn)換】。
此函數(shù),也可以像[StrSplit]函數(shù)一樣,將字符串分解成單列,只要參數(shù)@ColumnStr=‘’
當然,也可以將表的列名存儲在字符串中,....
下面是SQL代碼:
FUNCTION [dbo].[StrSplit_Tab](
@String nvarchar(MAX) --待分割字符串
,@RowStr nvarchar(10) --行分割符
,@ColumnStr nvarchar(10)--列分割符
,@NullItem int=0 --是否保留【空元素】[item]的位置編號。不為0保留,為0不保留。
)returns @Tab table(
[Row] int --[Row]:行編號(1,2,3,4,5......)
,[Column]nvarchar(20) --[Column]:列編號(F1,F2,F3.....)
,[item] nvarchar(MAX)) --[item]:單元格元素
as
begin
IF ISNULL(@RowStr,'')='' begin --無【行分割符@RowStr】,返回原文
insert into @Tab([Row],[Column],[item]) VALUES (1,'',@String);
RETURN;
end;
SET @NullItem=ISNULL(@NullItem,0);
declare @Ritem nvarchar(MAX); --行文本
declare @begin as int=1,@end as int;--截取文本,起止位置
declare @RL AS int=LEN(@RowStr);--分隔符長度
declare @R AS int=0;--行號
--分解行
set @end=charindex(@RowStr,@String,@begin);
while(@end<>0)
begin
set @Ritem = substring(@String,@begin,@end-@begin);
IF @NullItem<>0 SET @R=@R+1;
IF len(@Ritem)>0 begin
--分解列 --自我調(diào)用
IF @NullItem=0 SET @R=@R+1;
insert into @Tab([Row],[Column],[item])
SELECT @R,'F'+CAST([Row] as nvarchar(50)),[item]
FROM [dbo].[StrSplit_Tab](@Ritem,@ColumnStr,'');
end;
set @begin=@end+@RL;
set @end=charindex(@RowStr,@String,@begin);
end
--末尾文本處理
set @Ritem = substring(@String,@begin,len(@String)+1-@begin);
IF len(@Ritem)>0 begin
SET @R=@R+1;
--分解列 --自我調(diào)用
insert into @Tab([Row],[Column],[item])
SELECT @R,'F'+CAST([Row] as nvarchar(50)),[item]
FROM [dbo].[StrSplit_Tab](@Ritem,@ColumnStr,'');
end;
return
end
--==============使用范例=====================
select [Row] as 'Row',
max([F1]) as 'F1',
max([F2]) as 'F2',
max([F3]) as 'F3'
from [dbo].[StrSplit_Tab](
';;:小康:342222199506186034;楊藍:342222197909226046:;向鳳:42282519890310110X;;楊玉:510227197510122765;;;'
,';'
,':'
,1)
pivot(
max([item]) for [Column]
in (F1,F2,F3)
)as B
group by [Row]
order by [Row] asc
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。