/*
功能:实现split功能的函数
*/create function dbo.fn_split
(
@inputstr varchar(8000),
@seprator varchar(10)
)
returns @temp table (a varchar(200))
as begin
declare @i intset @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)
endif @inputstr <> '\'
insert @temp values(@inputstr)return
end
go--调用declare @s varchar(1000)set @s='1,2,3,4,5,6,7,8,55'select * from dbo.fn_split(@s,',')drop function dbo.fn_split
功能:实现split功能的函数
*/create function dbo.fn_split
(
@inputstr varchar(8000),
@seprator varchar(10)
)
returns @temp table (a varchar(200))
as begin
declare @i intset @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)
endif @inputstr <> '\'
insert @temp values(@inputstr)return
end
go--调用declare @s varchar(1000)set @s='1,2,3,4,5,6,7,8,55'select * from dbo.fn_split(@s,',')drop function dbo.fn_split
----------------------
龟啊,人家的还是非规则的哦。。会不会不规则到有各种各样的符号在里面啊?嘿嘿```
表b中的infoID是表a中的ID列的编号表a中的label列中有可能出现其他类型的符号。
create table 表A(ID varchar(10), Label varchar(50))
insert into 表A values('a1', ',中国,美国,日本,韩国')
insert into 表A values('a2', '汽车,飞机,,轮船,,')
insert into 表A values('a3', '天津,')
insert into 表A values('a4', '')
goselect px = identity(int , 1, 1) , * into tmp from
(
SELECT A.id, B.Label
FROM(
SELECT id, [Label] = CONVERT(xml,'<root><v>' + REPLACE([Label], ',', '</v><v>') + '</v></root>') FROM 表A
)A
OUTER APPLY(
SELECT Label = N.v.value('.', 'varchar(100)') FROM A.[Label].nodes('/root/v') N(v)
)B
)T where Label is not null and Label <> ''select * from tmpdrop table 表A,tmp/*
px id Label
----------- ---------- ------
1 a1 中国
2 a1 美国
3 a1 日本
4 a1 韩国
5 a2 汽车
6 a2 飞机
7 a2 轮船
8 a3 天津(8 行受影响)
*/
分拆列值原著:邹建
改编:爱新觉罗.毓华 2007-12-16 广东深圳有表tb, 如下:
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
欲按id,分拆value列, 分拆后结果如下:
id value
----------- --------
1 aa
1 bb
2 aaa
2 bbb
2 ccc1. 旧的解决方法
SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b SELECT A.id, SUBSTRING(A.[values], B.id, CHARINDEX(',', A.[values] + ',', B.id) - B.id)
FROM tb A, # B
WHERE SUBSTRING(',' + A.[values], B.id, 1) = ','DROP TABLE #2. 新的解决方法 create table tb(id int,value varchar(30))
insert into tb values(1,'aa,bb')
insert into tb values(2,'aaa,bbb,ccc')
go
SELECT A.id, B.value
FROM(
SELECT id, [value] = CONVERT(xml,'<root><v>' + REPLACE([value], ',', '</v><v>') + '</v></root>') FROM tb
)A
OUTER APPLY(
SELECT value = N.v.value('.', 'varchar(100)') FROM A.[value].nodes('/root/v') N(v)
)BDROP TABLE tb/*
id value
----------- ------------------------------
1 aa
1 bb
2 aaa
2 bbb
2 ccc(5 行受影响)
*/
insert into tA values('a1', ',中国,美国,日本,韩国')
insert into tA values('a2', '汽车,飞机,,轮船,,')
insert into tA values('a3', '天津,')
insert into tA values('a4', '')
go
create table tb(ID varchar(2),Label varchar(10),InfoID varchar(10))
insert tb select
'b1','中国','' union select
'b2','美国','' union select
'b3','日本','' union select
'b4','韩国','' union select
'b5','汽车','' union select
'b6','飞机','' union select
'b7','轮船','' union select
'b8','天津',''
go
create trigger trigger_u
on ta
for insert
as
begin
update a
set infoid = b.id
from tb a
right join inserted b on charindex(a.Label,b.Label) > 0
end
go
select * from tb
/*
ID Label InfoID
---- ---------- ----------
b1 中国
b2 美国
b3 日本
b4 韩国
b5 汽车
b6 飞机
b7 轮船
b8 天津 (所影响的行数为 8 行)
*/
insert into tA values('a1', ',中国,美国,日本,韩国')
insert into tA values('a2', '汽车,飞机,,轮船,,')
insert into tA values('a3', '天津,')
insert into tA values('a4', '')
select * from tb
/*
ID Label InfoID
---- ---------- ----------
b1 中国 a1
b2 美国 a1
b3 日本 a1
b4 韩国 a1
b5 汽车 a2
b6 飞机 a2
b7 轮船 a2
b8 天津 a3(所影响的行数为 8 行)*/
drop table ta,tb
--各种字符串分函数
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_splitSTR]
GO--3.2.1 循环截取法
CREATE FUNCTION f_splitSTR(
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS @re TABLE(col varchar(100))
AS
BEGIN
DECLARE @splitlen int
SET @splitlen=LEN(@split+'a')-2
WHILE CHARINDEX(@split,@s)>0
BEGIN
INSERT @re VALUES(LEFT(@s,CHARINDEX(@split,@s)-1))
SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
END
INSERT @re VALUES(@s)
RETURN
END
GO/*==============================================*/if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_splitSTR]
GO--3.2.3.1 使用临时性分拆辅助表法
CREATE FUNCTION f_splitSTR(
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS @re TABLE(col varchar(100))
AS
BEGIN
--创建分拆处理的辅助表(用户定义函数中只能操作表变量)
DECLARE @t TABLE(ID int IDENTITY,b bit)
INSERT @t(b) SELECT TOP 8000 0 FROM syscolumns a,syscolumns b INSERT @re SELECT SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID)
FROM @t
WHERE ID<=LEN(@s+'a')
AND CHARINDEX(@split,@split+@s,ID)=ID
RETURN
END
GO
select * from dbo.f_splitSTR('10.10.11','.')
/*==============================================*/if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_splitSTR]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_splitSTR]
GOif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tb_splitSTR]') and objectproperty(id,N'IsUserTable')=1)
drop table [dbo].[tb_splitSTR]
GO--3.2.3.2 使用永久性分拆辅助表法
--字符串分拆辅助表
SELECT TOP 8000 ID=IDENTITY(int,1,1) INTO dbo.tb_splitSTR
FROM syscolumns a,syscolumns b
GO--字符串分拆处理函数CREATE FUNCTION f_splitSTR(
@s varchar(8000), --待分拆的字符串
@split varchar(10) --数据分隔符
)RETURNS TABLE
AS
RETURN(
SELECT col=CAST(SUBSTRING(@s,ID,CHARINDEX(@split,@s+@split,ID)-ID) as varchar(100))
FROM tb_splitSTR
WHERE ID<=LEN(@s+'a')
AND CHARINDEX(@split,@split+@s,ID)=ID)
GO
旧的解决办法应该是2000拆分字符串的功能吧,然后下面新的解决办法是2005里面的拆分功能?无枪狙击手的代码功能应该是关联A和B中的数据吧。其实B表中的数据是不存在的,完全是由A表继承来的数据。也就是说B表的label都是由A表的Label字段拆分形成的。
无枪狙击手的代码功能应该是关联A和B中的数据吧。其实B表中的数据是不存在的,完全是由A表继承来的数据。也就是说B表的label都是由A表的Label字段拆分形成的。
---
哦,
where col<>''
中国
美国
日本
韩国
把不规则的空去掉
--楼主一定要触发器?
--这么执着?只有按楼主的要求写一下了。create table 表A(ID varchar(10), Label varchar(50))create table 表B(ID varchar(10),Label varchar(50),InfoID varchar(50))create trigger wsp_tr on 表A for insert
as
begin
declare @id varchar(10),@label varchar(50)
select @id=id,@label=label from inserted
if(len(replace(@label,' ',''))<>0)
begin
set @label=replace(@label+',',',,',',')
declare @lab varchar(50)
while(charindex(',',@label)>0)
begin
set @lab=substring(@label,1,charindex(',',@label)-1)
set @label=substring(@label,charindex(',',@label)+1,len(@label))
if(len(replace(@lab,' ',''))<>0)
insert into 表B select 'b'+cast(isnull(max(stuff(id,1,1,'')),0)+1 as varchar),@lab,@id from 表B
end
end
end--测试
insert into 表A values('a1', ',中国,美国,日本,韩国')
insert into 表A values('a2', '汽车,飞机,,轮船,,')
insert into 表A values('a3', '天津,')
insert into 表A values('a4', '')--查看结果
select * from 表B