例子需求:把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=1while @location<>0            --T-SQL中没有for循环只能通过while循环来模拟for循环beginset @start=@location+1set @location=charindex(',',@str,@start)set @length=@length+1endreturn @length   --函数的返回值,即返回这个数组的长度endgo

上面这个例子有一个比较重要的系统自带的处理字符串的函数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
begindeclare @location intdeclare @start intdeclare @i intset @str=ltrim(rtrim(@str))set @start=1set @i=1set @location=charindex(',',@str) while @i<@indexbeginset @start=@location+1set @location=charindex(',',@str,@start)set @i=@i+1endreturn 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=@step1if(@tempParentId<1)--一级目录表中还没有插入begininsert into dbo.areaType values(@step1,@tempParentId,@tempStep,0,GETDATE())select @tempParentId=Id from dbo.AreaType where name=@step1--第二级插入select @tempStep=2insert into dbo.areaType values(@step2,@tempParentId,@tempStep,0,GETDATE())--第三级插入set @tempStep=3select @tempParentId=Id from dbo.AreaType where name=@step2declare @i int ,@step3Split nvarchar(100)select @tempStep=3,@i=1,@step3Split=''while(@i<dbo.Get_StrArrayLength(@step3))beginselect @step3Split=dbo.Get_StrArrayIndex(@step3,@i);insert into dbo.areaType values(@step3Split,@tempParentId,@tempStep,0,GETDATE());set @i=@i+1;endendelse --一级目录已经插入过了begin--第二级插入select @tempStep=2insert into dbo.areaType values(@step2,@tempParentId,@tempStep,0,GETDATE())--第三级插入set @tempStep=3select @tempParentId=Id from dbo.AreaType where name=@step2declare @j int ,@step3Split1 nvarchar(100)select @tempStep=3,@j=1,@step3Split1=''while(@j<dbo.Get_StrArrayLength(@step3))beginselect @step3Split1=dbo.Get_StrArrayIndex(@step3,@j);insert into dbo.areaType values(@step3Split1,@tempParentId,@tempStep,0,GETDATE());set @j=@j+1;endend
fetch next from import_cursor into @step1,@step2,@step3
end
close import_cursor  --关闭游标
deallocate import_cursor  --释放游标的资源

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

转载于:https://www.cnblogs.com/heluo/archive/2013/06/16/3134712.html

通过一个很实用的例子让你学会T-SQL编程的基本语法和思想相关推荐

  1. [C语言]一个很实用的服务端和客户端进行UDP通信的实例

    前段时间发了个TCP通信的例子,现在再来一个UDP通信的例子.这些可以作为样本程序,用到开发中."裸写"socket老是记不住步骤,经常被鄙视-- 下面的例子很简单,写一个UDP的 ...

  2. 5个让IT开发效率提高200%的工具,最后一个很实用,你用过几个

    某天,你的老板找到你:"咱对手弄了个很炫的大屏,都上电视了,咱也不能落后,2W搞得定?" 留下你一脸错愕,啥???2W?我给你2W,你自己做好不好? 其实,数据可视化大屏就好比是I ...

  3. 一个很实用的钢笔绘制工具PenTool

    demo 体验一下 最近在github上闲逛的时候发现了一个不错的小插件 penTool. 这个工具支持用鼠标在canvas上绘制路径.既然是工具,当然得比canvas原生的功能要强大突出的地方,我主 ...

  4. java 线程 进度条_关于Java进度条多线程调用问题,一个很实用的问题,希望熟悉多线程编程的高手看看...

    目前我在做一个C/S架构的Java应用,其中有一项查询操作非常耗时,可以增加个进度条以提高用户界面友好型.大体流程是这样的,在一个方法内 protected void action_queryButt ...

  5. python3 中调用post和get接口调用的很实用的例子

    用了很多方法都没有这个实用POST API接口:import json import requests if __name__ == '__main__':url = "http://127 ...

  6. linux tr命令书上的一个很好的例子

  7. Rsync:一个很实用的文件同步命令

    rsync是Linux系统下的文件同步和数据传输工具,可用于同步文件.代码发布 1.安装. yum insatll -y rsync 2.配置  打开rsync功能vim /etc/xinetd.d/ ...

  8. 用机器学习来预测情侣间何时吵架,这是一个很实用的算法

    本文来自AI新媒体量子位(QbitAI) "再给你最后一次选择的机会." "?" "王者荣耀,还是我?" "--" 别担 ...

  9. 一个很好用的DBHelper类(包括使用SQL语句 存储过程 事务 做相关操作) 入门级

    话不多少 直接贴代码 需引入的命名空间 需引入的命名空间 定义连接属性 SQL连接对象 private SqlConnection conn;public SqlConnection Conn {ge ...

最新文章

  1. simulink和psim仿真结果不同_案例展示金属增材制造过程仿真分析 (下篇)- 微观尺度...
  2. IOS和Andriod手机浏览器内核
  3. 对路径的访问被拒绝怎么办_学习了解ACL—扩展访问控制列表,就在网工知识角...
  4. C++使用数组实现stack堆栈(附完整源码)
  5. 2012年度最新免费web开发设计资源荟萃
  6. linux top 命令---VIRT,RES,SHR,虚拟内存和物理内存(
  7. 推荐系统(2)-协同过滤1-UserCF、ItemCF
  8. 亚马逊 html格式转换,亚马逊七种产品描述常用HTML代码,文字颜色代码让Listing更出彩...
  9. IDAPython 让你的生活更滋润 part1 and part2
  10. 马尔科夫细致平稳条件
  11. 三星苹果还能笑多久?联想挑战智能手机全球霸主
  12. excel查找匹配项vlookup函数
  13. 此实现不是 Windows 平台 FIPS 验证的加密算法的一部
  14. 浏览器中新开标签页(Tab)
  15. Android 9.0 (Pie)
  16. 飞机大战(案例详解)
  17. (正则表达式三行) 假设有一段英文,其中有单词中间的字母i误写为I,请编写程序进行纠正。
  18. cf----2019-09-14(You Are Given a Decimal String...,XOR Guessing,Boxers)
  19. C++_变量/常量/标识符命名规则
  20. TensorFlow提供Python语言的四个不同版本tensorflow,tensorflow-gpu,tf-nightly、tf-nightly-gpu

热门文章

  1. 男子用计算机rap劫匪,连Lex都在推荐的新番《催眠麦克风》直接一首rap将抢劫犯给rap崩溃!...
  2. 制作Tomcat镜像
  3. 不解压gz文件搜索文件内容
  4. 高血脂的症状 血脂升高后身体会有这4个症状
  5. 马踏棋盘(回溯算法)
  6. kivy之Popup弹窗部件的实操作学习
  7. Spring Boot 2.X - Spring Boot整合Swagger2(starter方式)
  8. 树莓派python gpio 模仿iic_GPIO实现I2C协议模拟(1)
  9. python常用api_常用的Python接口,C语言也挡不住Python的强大
  10. Linux 修改已存在的用户名