27,579
社区成员
发帖
与我相关
我的任务
分享
---参考这个题 思路
use tempdb;
create function fn_test
(@str nvarchar(max))
returns @sql table
(
textnet nvarchar(6),
tcontext nvarchar(max)
)
as
begin
set @str=replace(@str,char(10),'-')+N'-';
declare @n int;
set @n=len(@str);
while @n<>0
begin
insert into @sql
select SUBSTRING(@str,CHARINDEX(')',@str)+1,CHARINDEX(':',@str)-CHARINDEX(')',@str)-1),
SUBSTRING(@str,CHARINDEX(':',@str)+1,CHARINDEX('-',@str)-CHARINDEX(':',@str)-1);
set @str=right(@str,@n-charindex('-',@str));
set @n=len(@str);
end
return;
end
go
create table dbo.test
(
id int,
textnet nvarchar(max)
);
insert into dbo.test
select 60000,
N'(1)方大集团入主:债权人葫芦岛市商业银行站前支行
(2)辽宁方大:目前辽宁方大下属产业主要分布于四大业务板块
(3)破产重整:公司2010年4月21日起进入重整程序
(4)化工企业:公司是以基础化工生产为主的老工业基地
(5)TDI项目:公司与中国兵器工业集团公司下属北京高科公司共同出资。'
union all
select 70000,
N'(1)方大集团入主:债权人葫芦岛市商业银行站前支行
(2)辽宁方大:目前辽宁方大下属产业主要分布于四大业务板块
(3)破产重整:公司2010年4月21日起进入重整程序
(4)化工企业:公司是以基础化工生产为主的老工业基地
(5)TDI项目:公司与中国兵器工业集团公司下属北京高科公司共同出资。';
select id,yy.textnet,yy.tcontext
from dbo.test as xx
cross apply (select *
from dbo.fn_test(xx.textnet))as yy;
结果
id textnet tcontext
---- ------ -----------
60000 方大集团入主 债权人葫芦岛市商业银行站前支行
60000 辽宁方大 目前辽宁方大下属产业主要分布于四大业务板块
60000 破产重整 公司2010年4月21日起进入重整程序
60000 化工企业 公司是以基础化工生产为主的老工业基地
60000 TDI项目 公司与中国兵器工业集团公司下属北京高科公司共同出资。
70000 方大集团入主 债权人葫芦岛市商业银行站前支行
70000 辽宁方大 目前辽宁方大下属产业主要分布于四大业务板块
70000 破产重整 公司2010年4月21日起进入重整程序
70000 化工企业 公司是以基础化工生产为主的老工业基地
70000 TDI项目 公司与中国兵器工业集团公司下属北京高科公司共同出资。
create function fun_str
(@str varchar(100))
returns varchar(100)
as
begin
declare strcur cursor for
select COUNT(number)as row1
from (select number,ROW_NUMBER()over(order by number)as row
from master..spt_values
where type='p'
and substring(@str,number,1)='#')as t
group by (number-row)
order by row1 desc;
open strcur;
declare @n int;
fetch next from strcur into @n;
while @@FETCH_STATUS=0
begin
set @str=REPLACE(@str,REPLICATE('#',@n),@n);
fetch next from strcur into @n;
end
close strcur;
deallocate strcur;
return @str;
end
go
select dbo.fun_str('#文字###文字##文字#####')as str1,
dbo.fun_str('文字###文字##文字#####文字')as str2,
dbo.fun_str('文字######文字')as str3,
dbo.fun_str('#####')as str4
/**
str1 str2 str3 str4
--------------- ------------------ -------- --
1文字3文字2文字5 文字3文字2文字5文字 文字6文字 5
**/
--原来是这样发的(第一次源代码格式回复)
对于 '#文字###文字##文字#####' 楼主想要的结果是下面的么??
col1 col2 col3 col4 col5
-----------------------------------
1 文字 3 文字 2 文字 5
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- =============================================
-- Author: <龙在天涯>
-- Create date: <2010-09-22>
-- Description: <拆分字符串,并得到区分字符串的字符的个数>
--字符串格式:#到了极点###得分偶尔偶尔##发了的肌肤###的决定###### (其中#的个数不确定也无规律,并且字符结尾可以是#也可以是文字)
-- =============================================
ALTER FUNCTION [dbo].[funSplitString]
(
@strString VARCHAR(MAX),@strChar VARCHAR(1)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @i INT;
DECLARE @count INT;
DECLARE @strReturn VARCHAR(MAX);
DECLARE @subString VARCHAR(1000);
SET @subString = '';
SET @strReturn = '';
SET @count = 0;
SET @i = CHARINDEX(@strChar,@strString);
WHILE @i >= 0
BEGIN
IF @i = 1
BEGIN
SET @count = @count + 1;
SET @strString = SUBSTRING(@strString,2,LEN(@strString) - 1);
SET @i = CHARINDEX(@strChar,@strString);
END
ELSE
BEGIN
IF @i = 0
BEGIN
SET @strReturn = @strReturn + CONVERT(VARCHAR(50),@count);
BREAK;
END
SET @subString = SUBSTRING(@strString,1,@i - 1);
SET @strReturn = @strReturn + CONVERT(VARCHAR(50),@count) + @subString;
SET @strString = SUBSTRING(@strString,@i,LEN(@strString) - LEN(@subString));
SET @i = CHARINDEX(@strChar,@strString);
SET @count = 0;
END
END
RETURN @strReturn;
END
declare @s varchar(30)
set @s='#文字###文字##文字#####'
while charindex('##',@s)>0
begin
set @s=replace(@s,'##','#')
end
print @s
/*
#文字#文字#文字#*/
create function dbo.fn_split(@inputstr varchar(8000), @seprator varchar(10))
returns @temp table (a varchar(200))
as
begin
declare @i int
set @inputstr = rtrim(ltrim(@inputstr))
set @i = charindex(@seprator , @inputstr)
while @i >= 1
begin
insert @temp values(left(@inputstr , @i - 1))
set @inputstr = substring(@inputstr , @i + 1 , len(@inputstr) - @i)
set @i = charindex(@seprator , @inputstr)
end
if @inputstr <> '\'
insert @temp values(@inputstr)
return
end
go
--调用
declare @str as varchar(30)
set @str = 'aaaa#123###1212123##4234343#####'
SELECT T.* FROM DBO.fn_split(@str,'#') T
WHERE LEN(a)>0
a
---------------------
aaaa
123
1212123
4234343
(4 row(s) affected)