一道存储过程面试题
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