哪位高手指教下 !!!!!!!!!!!!!!!!!!
我想实现这样一个功能 有一张表其中一个字段中的数据 有的有一条 有多条的是用“;”(分号)隔开的 现在想把这样有多条数据的查出来 然后分开 分别插入原表;
应该怎么办呢?
比如: 科目 学生
语文 张三;李四
换成 科目 学生
语文 张三;
语文 李四
------解决方案-------------------- /*
功能:实现split功能的函数
*/
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
create table #t(科目 varchar(100),学生 varchar(100))
insert into #t select '语文 ', '张三;李四 '
--select * from #t
create table #tt(科目 varchar(100),学生 varchar(100))
declare cur cursor
read_only
for select 科目,学生 from #t
declare @km varchar(40),@xs varchar(100)
open cur
fetch next from cur into @km,@xs
while (@@fetch_status=0)
begin
insert into #tt
select @km,a
from dbo.fn_split(@xs, '; ')
fetch next from cur into @km,@xs
end
close cur
deallocate cur
go
select * from #tt
drop table #t
drop table #tt
go
drop function fn_split
go
------解决方案--------------------CREATE TABLE A(id INT,country VARCHAR(100))
INSERT A
SELECT 1, '中国;日本;韩国 ' UNION ALL
SELECT 2, '美国;意大利;法国 ' UNION ALL
SELECT 3, '德国 '
SELECT * FROM A
-- 建立一个辅助的临时表就可以了
SELECT TOP 8000 id = identity(int,1,1)
INTO # FROM syscolumns a, syscolumns b
SELECT
A.ID,
COUNTRY = SUBSTRING(A.COUNTRY, B.ID, CHARINDEX( '; ', A.COUNTRY + '; ', B.ID) - B.ID)
FROM A, # B
WHERE SUBSTRING( '; ' + a.COUNTRY, B.id, 1) = '; '
ORDER BY 1,2
GO
DROP TABLE A,#
id country
----------- ----------------
1 中国;日本;韩国
2 美国;意大利;法国
3 德国
(所影响的行数为 3 行)
ID COUNTRY
----------- ---------
1 韩国
1 日本
1 中国
2 法国
2 美国
2 意大利
3 德国
(所影响的行数为 7 行)
------解决方案--------------------if object_id( 'pubs..A ') is not null
drop table A
go
create table A(科目 varchar(10),学生 varchar(10))
insert into A(科目,学生) values( '语文 ', '张三;李四 ')
insert into A(科目,学生) values( '数学 ', '张三;李四 ')
-- 建立一个辅助的临时表就可以了
SELECT TOP 8000