• 通过一个很实用的例子让你学会TSQL编程的基本语法和思想


    例子需求:把Execl中的三级分类(列别的三级联动)数据导入到数据库中。

         Excel表中数据的显示格式:

         图1

         数据库中表的显示格式:

         图2

    首先把Excell表中的数据导入到数据库的临时表中(右键 点击数据库->任务->导入数据,根据自己的数据源类型就能导入到数据库了),然后通过TSQ编程把临时表中的数据导入分类表。

    (1)再导入的过程中,若是用到数组会简单许多,但是TSQ编程中没有数组,我们可以写一个方法来模仿数组的功能,同时了解一下T—SQL编程的基本语法:

          我们使用数组是为了存储数据和遍历数据,存储数据用一个有规则的字符串,如“12,23,45,67”,这样两个逗号之间的内容可以看成一个数组的元素,也可以用“、”,“|”等其他符号分割,为了逻辑的简便,下面的例子用逗号分割;接下来是遍历数组,我们在遍历高级数组的时候用到两份方法,一个是知道这个数组的长度,一个是能根据指定的索引获取数组的元素值;所以我们就创建这两个方法Get_Str_ArrayLength()和Get_StrArrayIndex()来获取数组的长度和指定索引的值;

    下面的是创建一个标量函数,创建过的函数在同一个数据库中能多次使用,

    use Test
    ----获取字符串中元素的个数
    go   --go表示一批T-SQL命令语句的开始和结束
    create function Get_StrArrayLength   --创建标量函数
    (
    @str nvarchar(1024)    ---函数的参数名称和类型
    )
    returns int   ---函数的返回类型
    as
    begin         ---beng和end 相当于C#中的{}
     declare @location int,@start int,@length int        --通过declare来声明参数
      set @str=ltrim(rtrim(@str))           --通过set和select给参数赋值,set一次只能给一个参数赋值,select一次可以给多个参数赋值
      set @location=charindex(',',@str)
      set @length=1
       while @location<>0            --T-SQL中没有for循环只能通过while循环来模拟for循环
         begin
          set @start=@location+1
          set @location=charindex(',',@str,@start)
          set @length=@length+1
         end
       return @length   --函数的返回值,即返回这个数组的长度
     end
     
    go

    上面这个例子有一个比较重要的系统自带的处理字符串的函数charindex(str1,str,startIndex),即获取str1在str中其实位置的索引,startIndex可为空为空时,起始位置为1,T-SQL的索引是从1开始的不像C#是从0开始的。
    获取指定索引的值还需要一个比较重要的字符串处理函数substring(str,startIndex,num)。看一下下面的例子,熟悉一下这两个函数:

    declare @str nvarchar(100),@str1 nvarchar(100)
    set @str='123sdfs53refsdgh'
    set @str1=CHARINDEX('3s',@str)
    print @str1  --3
    set @str1=SUBSTRING(@str,2,5)
    print @str1 --23sdf

     获取指定索引的元素值

    go
    create function Get_StrArrayIndex
    (
    @str nvarchar(500),
    @index int --3
    )
    returns nvarchar(100)
    as 
    begin
     declare @location int
     declare @start int
     declare @i int
     set @str=ltrim(rtrim(@str))
     set @start=1
     set @i=1
     set @location=charindex(',',@str) 
     while @i<@index
       begin
        set @start=@location+1
        set @location=charindex(',',@str,@start)
        set @i=@i+1
       end
     return substring(@str,@start,@location-@start)
    end
    go

    有了上面这两个标量函数,我们在以后的T-SQl编程中就可以像使用系统函数一样使用,下面步入正题把临时表中的数据导入到三级分类表,方法有很多,这里使用游标,因为游标相对好理解点,使用游标比较消耗性能,所以一般情况下不用,在万般无奈的情况下才用。我们就先大概说一下游标的原理:游标就是能够把数据库中表的内容一行一行的拿出来处理。想进一步了解游标,网上有篇不错的文章大家可以参考一下:http://www.cnblogs.com/moss_tan_jun/archive/2011/11/26/2263988.html

    下面看例子:area为临时表数据相当于图1 ,AreaType为要导入进去的表;

    --声明参数
    declare @step1 nvarchar(50),@step2 nvarchar(50),@step3 nvarchar(3000),@tempParentId int,@tempStep int
    declare import_cursor cursor for  --声明游标
    select step1,step2,step3 from area  --游标所要遍历的一行一行的数据集
    open import_cursor                  --打开游标
    fetch next from import_cursor into @step1,@step2,@step3  --把遍历结果赋值给这三个参数
    while (@@FETCH_STATUS=0)   --通过@@FETCH_STATUS=0判断游标是否遍历完
    begin
        --第一级插入
        select @tempParentId=0,@tempStep=1
        --判断一下一级目录是否已经插入了
        select @tempParentId=Id from dbo.AreaType where name=@step1
        if(@tempParentId<1)--一级目录表中还没有插入
        begin
            insert into dbo.areaType values(@step1,@tempParentId,@tempStep,0,GETDATE())
            select @tempParentId=Id from dbo.AreaType where name=@step1
                --第二级插入
                select @tempStep=2
                insert into dbo.areaType values(@step2,@tempParentId,@tempStep,0,GETDATE())
                    --第三级插入
                   set @tempStep=3
                   select @tempParentId=Id from dbo.AreaType where name=@step2
                   declare @i int ,@step3Split nvarchar(100)
                   select @tempStep=3,@i=1,@step3Split=''
                   while(@i<dbo.Get_StrArrayLength(@step3))
                       begin
                       select @step3Split=dbo.Get_StrArrayIndex(@step3,@i);
                       insert into dbo.areaType values(@step3Split,@tempParentId,@tempStep,0,GETDATE());
                       set @i=@i+1;
                       end
        end
        else --一级目录已经插入过了
        begin
        --第二级插入
                select @tempStep=2
                insert into dbo.areaType values(@step2,@tempParentId,@tempStep,0,GETDATE())
                    --第三级插入
                   set @tempStep=3
                   select @tempParentId=Id from dbo.AreaType where name=@step2
                   declare @j int ,@step3Split1 nvarchar(100)
                   select @tempStep=3,@j=1,@step3Split1=''
                       while(@j<dbo.Get_StrArrayLength(@step3))
                       begin
                       select @step3Split1=dbo.Get_StrArrayIndex(@step3,@j);
                       insert into dbo.areaType values(@step3Split1,@tempParentId,@tempStep,0,GETDATE());
                       set @j=@j+1;
                       end
        end
    fetch next from import_cursor into @step1,@step2,@step3           
    end
    close import_cursor  --关闭游标
    deallocate import_cursor  --释放游标的资源

    里面用到了我们上面定义的两个标量函数Get_Str_ArrayLength()和Get_StrArrayIndex(),主要是为了拆分第三级目录进行插入,里面的逻辑很简单,就不在此说了。

  • 相关阅读:
    U8g2库I2C总线再次突破性调试成功
    要学的东西太多了,还想学习opencv
    中断知识
    别人做的扫地机器人,有机会我也想搞一台!
    团队冲刺第五天
    第八周学习进度
    团队冲刺第四天
    构建之法1
    团队冲刺第三天
    团队冲刺第二天
  • 原文地址:https://www.cnblogs.com/heluo/p/3134712.html
Copyright © 2020-2023  润新知