日期:2014-05-18  浏览次数:20377 次

哪位高手指教下 !!!!!!!!!!!!!!!!!!
我想实现这样一个功能     有一张表其中一个字段中的数据   有的有一条   有多条的是用“;”(分号)隔开的     现在想把这样有多条数据的查出来   然后分开   分别插入原表;

应该怎么办呢?

比如:       科目         学生
                  语文         张三;李四

换成         科目         学生
                语文         张三;
                语文         李四

------解决方案--------------------


/*
功能:实现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