通过一个很实用的例子让你学会T-SQL编程的基本语法和思想
例子需求:把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编程的基本语法和思想相关推荐
- [C语言]一个很实用的服务端和客户端进行UDP通信的实例
前段时间发了个TCP通信的例子,现在再来一个UDP通信的例子.这些可以作为样本程序,用到开发中."裸写"socket老是记不住步骤,经常被鄙视-- 下面的例子很简单,写一个UDP的 ...
- 5个让IT开发效率提高200%的工具,最后一个很实用,你用过几个
某天,你的老板找到你:"咱对手弄了个很炫的大屏,都上电视了,咱也不能落后,2W搞得定?" 留下你一脸错愕,啥???2W?我给你2W,你自己做好不好? 其实,数据可视化大屏就好比是I ...
- 一个很实用的钢笔绘制工具PenTool
demo 体验一下 最近在github上闲逛的时候发现了一个不错的小插件 penTool. 这个工具支持用鼠标在canvas上绘制路径.既然是工具,当然得比canvas原生的功能要强大突出的地方,我主 ...
- java 线程 进度条_关于Java进度条多线程调用问题,一个很实用的问题,希望熟悉多线程编程的高手看看...
目前我在做一个C/S架构的Java应用,其中有一项查询操作非常耗时,可以增加个进度条以提高用户界面友好型.大体流程是这样的,在一个方法内 protected void action_queryButt ...
- python3 中调用post和get接口调用的很实用的例子
用了很多方法都没有这个实用POST API接口:import json import requests if __name__ == '__main__':url = "http://127 ...
- linux tr命令书上的一个很好的例子
- Rsync:一个很实用的文件同步命令
rsync是Linux系统下的文件同步和数据传输工具,可用于同步文件.代码发布 1.安装. yum insatll -y rsync 2.配置 打开rsync功能vim /etc/xinetd.d/ ...
- 用机器学习来预测情侣间何时吵架,这是一个很实用的算法
本文来自AI新媒体量子位(QbitAI) "再给你最后一次选择的机会." "?" "王者荣耀,还是我?" "--" 别担 ...
- 一个很好用的DBHelper类(包括使用SQL语句 存储过程 事务 做相关操作) 入门级
话不多少 直接贴代码 需引入的命名空间 需引入的命名空间 定义连接属性 SQL连接对象 private SqlConnection conn;public SqlConnection Conn {ge ...
最新文章
- simulink和psim仿真结果不同_案例展示金属增材制造过程仿真分析 (下篇)- 微观尺度...
- IOS和Andriod手机浏览器内核
- 对路径的访问被拒绝怎么办_学习了解ACL—扩展访问控制列表,就在网工知识角...
- C++使用数组实现stack堆栈(附完整源码)
- 2012年度最新免费web开发设计资源荟萃
- linux top 命令---VIRT,RES,SHR,虚拟内存和物理内存(
- 推荐系统(2)-协同过滤1-UserCF、ItemCF
- 亚马逊 html格式转换,亚马逊七种产品描述常用HTML代码,文字颜色代码让Listing更出彩...
- IDAPython 让你的生活更滋润 part1 and part2
- 马尔科夫细致平稳条件
- 三星苹果还能笑多久?联想挑战智能手机全球霸主
- excel查找匹配项vlookup函数
- 此实现不是 Windows 平台 FIPS 验证的加密算法的一部
- 浏览器中新开标签页(Tab)
- Android 9.0 (Pie)
- 飞机大战(案例详解)
- (正则表达式三行) 假设有一段英文,其中有单词中间的字母i误写为I,请编写程序进行纠正。
- cf----2019-09-14(You Are Given a Decimal String...,XOR Guessing,Boxers)
- C++_变量/常量/标识符命名规则
- TensorFlow提供Python语言的四个不同版本tensorflow,tensorflow-gpu,tf-nightly、tf-nightly-gpu
热门文章
- 男子用计算机rap劫匪,连Lex都在推荐的新番《催眠麦克风》直接一首rap将抢劫犯给rap崩溃!...
- 制作Tomcat镜像
- 不解压gz文件搜索文件内容
- 高血脂的症状 血脂升高后身体会有这4个症状
- 马踏棋盘(回溯算法)
- kivy之Popup弹窗部件的实操作学习
- Spring Boot 2.X - Spring Boot整合Swagger2(starter方式)
- 树莓派python gpio 模仿iic_GPIO实现I2C协议模拟(1)
- python常用api_常用的Python接口,C语言也挡不住Python的强大
- Linux 修改已存在的用户名