• 一道存储过程面试题



    一道存储过程面试题 
    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
  • 相关阅读:
    C#如何用OpenFileDialog控件打开图片显示到PictureBox这个控件
    C# winform 禁止窗体移动
    linux 硬链接和软链接(转)
    linux 源码编译(转)
    linux 压缩与解压缩
    硬盘分区(来自百度百科)
    arp:地址解析协议(Address Resolution Protocol)(来自维基百科)
    c++学习笔记(1)
    ProbS CF matlab源代码(二分系统)(原创作品,转载注明出处,谢谢!)
    [eclipse]UML之AmaterasUML 插件
  • 原文地址:https://www.cnblogs.com/baiduligang/p/4247272.html
Copyright © 2020-2023  润新知