一道存储过程面试题

一道存储过程面试题
users1

  name    company    company_address   url1
  Joe     ABC        Work Lane        abc.com;xyz.com
  Jill    XYZ        Job Street       abc.com;xyz.com
写存储过程来创建新表
users2
  name company    company_address    url1

  Joe  ABC     Work Lane          abc.com
    Joe         ABC        Work Lane          xyz.com
  Jill        XYZ        Job Street         abc.com
    Jill        XYZ        Job Street         xyz.com
===========================================================================================================
drop table users1
go
create table users1 (name varchar(10),company varchar(10),company_address varchar(20),url1 varchar(20))
insert into users1
select 'Joe','ABC','Work Lane','abc.com;xyz.com'
union all select 'Jill','XYZ','Job Street','abc.com;xyz.com'

drop proc up_test
go
create proc up_test
as
if exists(select 1 from sysobjects where type='U' and name='users2')
drop table users2
select * into users2
from (
select name,company,company_address,left(url1,charindex(';',url1)-1) as url1
from users1
union all
select name,company,company_address,right(url1,len(url1)-charindex(';',url1))
from users1)t
order by name,company,company_address
GO
exec up_test

select * from users2
/*
name       company    company_address      url1                
---------- ---------- -------------------- --------------------
Jill       XYZ        Job Street           abc.com
Jill       XYZ        Job Street           xyz.com
Joe        ABC        Work Lane            xyz.com
Joe        ABC        Work Lane            abc.com

(所影响的行数为 4 行)
*/

============================================================================================================

--應該寫function,然後根據;拆分紀錄

GO
--FUNCTION
Create    FUNCTION SplitList
(@separator char(1), @List varchar(8000))
RETURNS @ReturnTable TABLE(ListItem varchar(1000) COLLATE Database_Default)
AS
BEGIN
DECLARE @Index int
DECLARE @NewText varchar(8000)
IF @List = null
RETURN
SET @Index = CHARINDEX(@separator, @List)
WHILE NOT(@Index = 0)
BEGIN
SET @NewText = RTRIM(LTRIM(LEFT(@List, @Index - 1)))
SET @List = RIGHT(@List, LEN(@List) - @Index)
INSERT INTO @ReturnTable(ListItem) VALUES(@NewText)
SET @Index = CHARINDEX(@separator, @List)
    END
 
INSERT INTO @ReturnTable(ListItem) VALUES(RTRIM(LTRIM(@List)))
        
     RETURN
END

GO
--測試數據
create table users1(name  varchar(10) ,  company  varchar(20),  company_address  varchar(20), url1 varchar(100) )
insert into users1 select    'Joe'   ,'ABC'  ,'Work Lane'  ,'abc.com;xyz.com'
insert into users1 select   'Jill'   ,'XYZ'  ,'Job Street' , 'abc.com;xyz.com'

create table users2(name  varchar(10) ,  company  varchar(20),  company_address  varchar(20), url1 varchar(100) )
GO
--存儲過程

Create procedure dbo.usp_test
AS

declare @name  varchar(10) ,  @company  varchar(20),  @company_address  varchar(20), @url1 varchar(100)
declare c1 cursor for
select * from users1
open c1
fetch next from c1 into @name,@company,@company_address,@url1
while @@fetch_status=0
begin
  insert into users2
   select @name,@company,@company_address,ListItem from dbo.SplitList(';',@url1) T
  fetch next from c1 into @name,@company,@company_address,@url1
end
close c1
deallocate c1

GO

exec dbo.usp_test
select * from users2
/*
name    company      company_address           url1
Joe ABC  Work Lane            abc.com
Joe ABC  Work Lane            xyz.com
Jill XYZ  Job Street         abc.com
Jill XYZ  Job Street          xyz.com

*/

drop table users1,users2
drop proc usp_test
drop function splitlist


 

posted @ 2007-05-11 13:37  RobotTech  阅读(3465)  评论(0编辑  收藏  举报