T-SQL编程的基本语法和思想
通过一个很实用的例子让你学会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=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(),主要是为了拆分第三级目录进行插入,里面的逻辑很简单,就不在此说了。
T-SQL编程的基本语法和思想的更多相关文章
- 【PL/SQL编程基础】
[PL/SQL编程基础]语法: declare 声明部分,例如定义变量.常量.游标 begin 程序编写,SQL语句 exception 处理异常 end: / 正斜杠表示执行程序快范例 -- Cre ...
- pl/sql编程
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- SQL编程的一些良好好习惯
|转载自:cnblog |原文链接:http://www.cnblogs.com/MR_ke/archive/2011/05/29/2062085.html 我们做软件开发的,大部分人都离不开跟数据库 ...
- sqL编程篇(三) 游标与存储过程
sql编程2 游标与存储过程 sql编程中的游标的使用:提供的一种对查询的结果集进行逐行处理的一种方式不用游标的处理解决方式:逐行修改工资update salar set 工资=‘新工资’ where ...
- sql编程小结
对照mysql5.1手册,对这几天学的sql编程进行小结,主要涉及触发器.存储过程.权限管理.主从分离等,权当抛砖引玉,高手请略过. 一.触发器 通俗的说就是在指定的数据表增删改的前或后触发执行特定的 ...
- Oracle中PL/SQL简介、基本语法以及数据类型
Oracle中PL/SQL简介.基本语法以及数据类型 一.PL/SQL简介. Oracle PL/SQL语言(Procedural Language/SQL)是结合了结构化查询和Oracle自身过程控 ...
- ORACLE PL/SQL编程详解
ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...
- SQL编程之高级查询(子查询)以及注意事项
SQL编程之高级查询(子查询)以及注意事项 1.什么是子查询? 当一个查询是另一个查询的条件时,称之为子查询.子查询可以使用几个简单命令构造功能强大的复合命令.子查询最常用于SELECT-SQL命 ...
- 自从学了SQL编程,哪里不会点哪里!!!
在学习SQL编程前,先给大家分享几个段子吧,咱先乐呵乐呵! <桃花庵--程序员版> 写字楼里写字间,写字间中程序员:程序人员写程序,又将程序换酒钱: 酒醒只在屏前坐,酒醉还来屏下眠:酒醉酒 ...
随机推荐
- 基于 自己定义注解 和 aop 实现使用memcache 对数据库的缓存 演示样例
好久没更新blog了,在新公司打拼了两个月,每天都从早忙到晚,学到了非常多东西,可是没有时间来更新blog了.... 以下開始解说这次的主题 公司老大让我研究 ocs 就是阿里云的 开放缓存服务 点击 ...
- 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例(原创)
天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...
- php rsa 加密、解密、签名、验签
由于对接第三方机构使用的是Java版本的rsa加解密方法,所有刚开始在网上搜到很多PHP版本的rsa加解密,但是对接java大多都不适用. 以下php版本是适用于对接java接口,java适用密钥再p ...
- vim打开出现的文档^M什么
网上公开的一些代码,发现里面多^M符号.这是什么? 我搜索^M没有效果,这应该是一个特殊的控制字符.找换行的结果是不.在每一行的末尾是回车,代替它周围包裹,对于由线定义不同的编码系统是不一样的. li ...
- atitit.ajax bp dwr 3.该票据安排使用的流量汇总 VO9o.....
atitit.ajax bp dwr 3.该票据安排使用的流量汇总 VO9o..... 1. 安装配置 1 1.1. 下载 dwr.jar 1M 1 1.2. 配置注解方式..web.xml 1 2 ...
- Asterisk 未来之路3.0_0005
原文:Asterisk 未来之路3.0_0005 第二章: Asterisk的架构 Asterisk 和其他众多传统的PBX是有区别的,拨号方案针对各种通道处理本质上采用同一种方式. 在传统的PB ...
- Spring MVC 的 研发之路
翻译器:intellij idea 一个.创建spring mvcproject 一个. 二. 三. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcX ...
- JTAG应该如何接线
下面是某个ARM9评估板的原理图: 注意: 1. Vref和Vtarget可以直接连在一起,由被调试板提供3.3V或5V电源: 2. nTRST,最好上拉: 3. TDI,最好上拉 4. TMS,最好 ...
- JSON数据转换方法 parse()和stringify()
将对象转换成JSON格式的文本数据 var str = JSON.stringify(data); 将对象转换成JSON对象的方法 var data = JSON.parse(str);
- 入门 ASP.NET Web API 2 (C#)
入门 ASP.NET Web API 2 (C#) HTTP 不只是为了生成 web 页面.它也是一个强大的建设公开服务和数据 Api的平台. HTTP 的特性:简单. 灵活和无处不在.你能想到的几乎 ...