当前位置:文档之家› 存储过程基本语法

存储过程基本语法

存储过程1.存储过程例子 (1)2.SQL Server 字符串函数 (4)3. SQL Server 存储过程基本语法 (9)1.存储过程例子以下通过表Student 来了解存储过程,因为是要了解存储过程的简单用法,所以所有例子均很简单。

无参数存储过程:选出Student表中的所有信息,有参数存储过程:全局变量全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。

选出指定姓名的学生信息:上面是在外部给变量赋值,也可以在内部直接给变量设置默认值也可以把变量的内容输出,使用output以上是全局变量,下面来了解局部变量局部变量也称为内部变量。

局部变量是在函数内作定义说明的。

其作用域仅限于函数内部,离开该函数后再使用这种变量是非法的。

局部变量的定义:必须先用Declare命令定以后才可以使用,declare{@变量名数据类型}局部变量的赋值方法:set{@变量名=表达式}或者select{@变量名=表达式}局部变量的显示:select @变量名那如果是要把局部变量的数据显示出来怎么办呢?2.SQL Server 字符串函数以下所有例子均Studnet表为例:计算字符串长度len()用来计算字符串的长度字符串转换为大、小写lower() 用来将一个字符串转换为小写,upper() 用来将一个字符串转换为大写截去字符串左、右侧空格ltrim() 用来将一个字符串左侧的空格去掉,rtrim()用来将一个字符串右侧的空格去掉返回由重复的空格组成的字符串space(integer_expression)integer_expression 指示空格个数的正整数。

如果 integer_expression 为负,则返回空字符串。

取子字符串substring(string,start_position,length) 可以从任意位置取任意长度的子字符串,left(string,length) 从左侧开始取子字符串right(string,length)从右侧开始取子字符串字符串替换replace(string,要被替换的字符串,替换的字符串)返回字符串值的逆向值reverse(string_expression)删除指定长度的字符,并在指定的起点处插入另一组字符stuff(character_expression , start , length ,character_expression)start 一个整数值,指定删除和插入的开始位置。

length 一个整数,指定要删除的字符数。

以指定的次数重复字符串值replicate(string_expression ,integer_expression)返回字符串中指定表达式的开始位置charindex(expression1 ,expression2 , start_location )或charindex(expression1 ,expression2 )expression1在expression2 中的开始位置返回指定表达式中模式第一次出现的开始位置patindex('%pattern%',expression) 返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。

返回输入表达式的第一个字符的整数值unicode( 'ncharacter_expression' )' ncharacter_expression '为nchar 或 nvarchar 表达式。

返回由数字数据转换来的字符数据str(float_expression , length ,decimal )float_expression 带小数点的近似数字(float) 数据类型的表达式。

length 总长度。

它包括小数点、符号、数字以及空格。

默认值为10。

decimal 小数点右边的小数位数。

decimal 必须小于等于16。

如果 decimal 大于16,则将结果截断为小数点右边的16 位。

结果为:得到字符的ASCII码ascii()用来得到一个字符的ASCII码,它有且只有一个参数,如果参数为字符串,那么取第一个字符的ASCII码得到一个与ASCII码数字对应的字符Char(integer_expression) integer_expression 介于0 和255 之间的整数。

如果该整数表达式不在此范围内,将返回NULL 值。

返回返回具有指定的整数代码的Unicode 字符nchar(integer_expression)integer_expression 介于0 与65535 之间的正整数。

如果指定了超出此范围的值,将返回NULL。

返回带有分隔符的Unicode 字符串,分隔符的加入可使输入的字符串成为有效的SQL Server 分隔标识符。

quotename('character_string') character_string 不得超过128 个字符。

超过128 个字符的输入将返回NULL。

结果为:[abc[]]def] 请注意,字符串 abc[]def 中的右方括号有两个,用于指示转义符。

select QUOTENAME('abcdef','''') --分隔符是两个单引号-- 'abcdef'select QUOTENAME('abcdef') --分隔符是]-- [abcdef]select QUOTENAME('abcdef','{}') --分隔符是}-- {abcdef}发音匹配度有时候我们并不知道一个人姓名的拼写,但是我们知道他的发音,这时我们可以进行发音的匹配度测试。

soundex()用于计算一个字符串的发音特征性,这个特征值为一个四个字符的字符串,特征性的第一个字符总是初始字符串中的第一个字符,而后是一个三位数的数值。

结果为:发音特征值的含义非常复杂,如果要根据两个发音特征值来分析两个字符串的发音相似度的话非常麻烦。

可以使用difference()来简化两个字符串的发音相似度比较,它可以计算两个字符串的发音特征值,并且比较它们,然后返回一个0~4之间的值来反映两个字符串的发音相似度,这个值越大则表示两个字符串的发音相似度越大。

结果为:3.SQL Server 存储过程基本语法一、定义变量--简单赋值declare @a intset @a=5print @a--使用select语句赋值declare @user1 nvarchar(50)select @user1='张三'print @user1declare @user2 nvarchar(50)select @user2 = Name from ST_User where ID=1 print @user2--使用update语句赋值declare @user3 nvarchar(50)update ST_User set @user3 = Name where ID=1 print @user3二、表、临时表、表变量--创建临时表1create table #DU_User1([ID] [int] NOT NULL,[Oid] [int] NOT NULL,[Login] [nvarchar](50) NOT NULL,[Rtx] [nvarchar](4) NOT NULL,[Name] [nvarchar](5) NOT NULL,[Password] [nvarchar](max) NULL,[State] [nvarchar](8) NOT NULL);--向临时表1插入一条记录insert into #DU_User1 (ID,Oid,[Login],Rtx,Name,[Password],State) values (100,2,'LS','0000','临时','321','特殊');--从ST_User查询数据,填充至新生成的临时表select * into #DU_User2 from ST_User where ID<8--查询并联合两临时表select * from #DU_User2 where ID<3 union select * from #DU_User1--删除两临时表drop table #DU_User1drop table #DU_User2--创建临时表CREATE TABLE #t([ID] [int] NOT NULL,[Oid] [int] NOT NULL,[Login] [nvarchar](50) NOT NULL,[Rtx] [nvarchar](4) NOT NULL,[Name] [nvarchar](5) NOT NULL,[Password] [nvarchar](max) NULL,[State] [nvarchar](8) NOT NULL,)--将查询结果集(多条数据)插入临时表insert into #t select * from ST_User--不能这样插入--select * into #t from dbo.ST_User--添加一列,为int型自增长子段alter table #t add [myid] int NOT NULL IDENTITY(1,1)--添加一列,默认填充全球唯一标识alter table #t add [myid1] uniqueidentifier NOT NULL default(newid())select * from #tdrop table #t--给查询结果集增加自增长列--无主键时:select IDENTITY(int,1,1)as ID, Name,[Login],[Password] into #t from ST_Userselect * from #t--有主键时:select (select SUM(1) from ST_User where ID<= a.ID) as myID,* from ST_User a order by myID --定义表变量declare @t table(id int not null,msg nvarchar(50) null)insert into @t values(1,'1')insert into @t values(2,'2')select * from @t三、循环--while循环计算1到100的和declare @a intdeclare @sum intset @a=1set @sum=0while @a<=100beginset @sum+=@aset @a+=1endprint @sum四、条件语句--if,else条件分支if(1+1=2)beginprint '对'endelsebeginprint '错'end--when then条件分支declare @today intdeclare @week nvarchar(3)set @today=3set @week=casewhen @today=1 then '星期一'when @today=2 then '星期二'when @today=3 then '星期三'when @today=4 then '星期四'when @today=5 then '星期五'when @today=6 then '星期六'when @today=7 then '星期日'else '值错误'endprint @week五、游标declare @ID intdeclare @Oid intdeclare @Login varchar(50)--定义一个游标declare user_cur cursor for select ID,Oid,[Login] from ST_User --打开游标open user_curwhile @@fetch_status=0begin--读取游标fetch next from user_cur into @ID,@Oid,@Loginprint @ID--print @Loginendclose user_cur--摧毁游标deallocate user_cur六、触发器触发器中的临时表:Inserted存放进行insert和update 操作后的数据Deleted存放进行delete 和update操作前的数据--创建触发器Create trigger User_OnUpdateOn ST_Userfor UpdateAsdeclare @msg nvarchar(50)--@msg记录修改情况select @msg = N'姓名从“' + + N'”修改为“' + + '”' from Inserted,Deleted--插入日志表insert into [LOG](MSG)values(@msg)--删除触发器drop trigger User_OnUpdate七、存储过程--创建带output参数的存储过程CREATE PROCEDURE PR_Sum@a int,@b int,@sum int outputASBEGINset @sum=@a+@bEND--创建Return返回值存储过程CREATE PROCEDURE PR_Sum2@a int,@b intASBEGINReturn @a+@bEND--执行存储过程获取output型返回值declare @mysum intexecute PR_Sum 1,2,@mysum outputprint @mysum--执行存储过程获取Return型返回值declare @mysum2 intexecute @mysum2= PR_Sum2 1,2print @mysum2八、自定义函数函数的分类:1)标量值函数2)表值函数a:内联表值函数b:多语句表值函数3)系统函数--新建标量值函数create function FUNC_Sum1(@a int,@b int)returns intasbeginreturn @a+@bend--新建内联表值函数create function FUNC_UserTab_1(@myId int)returns tableasreturn (select * from ST_User where ID<@myId)--新建多语句表值函数create function FUNC_UserTab_2(@myId int)returns @t table([ID] [int] NOT NULL,[Oid] [int] NOT NULL,[Login] [nvarchar](50) NOT NULL,[Rtx] [nvarchar](4) NOT NULL,[Name] [nvarchar](5) NOT NULL,[Password] [nvarchar](max) NULL,[State] [nvarchar](8) NOT NULL)asbegininsert into @t select * from ST_User where ID<@myIdreturnend--调用表值函数select * from dbo.FUNC_UserTab_1(15)--调用标量值函数declare @s intset @s=dbo.FUNC_Sum1(100,50)print @s--删除标量值函数drop function FUNC_Sum1谈谈自定义函数与存储过程的区别:一、自定义函数:1. 可以返回表变量2. 限制颇多,包括不能使用output参数;不能用临时表;函数内部的操作不能影响到外部环境;不能通过select返回结果集;不能update,delete,数据库表;3. 必须return 一个标量值或表变量自定义函数一般用在复用度高,功能简单单一,争对性强的地方。

相关主题