java存储过程面试题_一道存储过程面试题

一道存储过程面试题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值