SQL语法基础与存储过程

  • 格式:doc
  • 大小:47.50 KB
  • 文档页数:6

SQL语法基础与存储过程

一、SQL语法基础

(一)注释

-- 单行注释,从这到本行结束为注释,类似C++,c#中//

/* „ */ 多行注释,类似C++,C#中/* „ */

(二)变量

int, smallint, tinyint, decimal,float,real, money ,

smallmoney,text ,image, char, varchar„„

语法:

DECLARE

{

{@local_variable data_type}

} [,...n]

例如:declare @ID int –声明一个名为@ID的变量,类型为int型

(三)在SQL Server窗口中打印出变量的值

语法:

PRINT 'any ASCII text' | @local_variable | @@FUNCTION | string_expr

(四)变量赋值

例如: --从数据表中取出第一行数据的ID,赋值给变量@id,然后打印出来

Declare @ID int

Set @ID = (select top(1) sno from student)

Print @ID

在SQL中,我们不能像代码那样直接给变量赋值,例如@id = 1,如果要达到这样的功能,可以这样写:

Declare @ID int

Set @ID = (select 1) -- 类似 @ID=1

Select @id=1 -- 类似 @ID=1

Print @ID

(五)变量运算(+,-,*,/,„„) 以下必要时候省略变量声明

Set @ID = (select 1+5) --类似 @ID=1+5

Set @ID=(select 1-@ID) --类似 @ID=1-@ID

(六)语句块:Begin „ end

将多条语句作为一个块,类似与C++,C#中的{ }

例如:

Begin

Set @ID1 = (select 1)

Set @ID2 = (select 2)

End

(八)条件语句If, if„else„

语法:

IF Boolean_expression

{sql_statement | statement_block}

[ELSE

{sql_statement | statement_block}]

例如:

If @id is not null

Print ‘@id is not null

if @ID = 1

begin

Set @ID = (select 1 + 1)

End

Else

Begin

set @ID=(select 1+2)

end

上面的例子用到了比较符,语句块,和IF的语法。

二、存储过程

(一)概念 存储过程(Stored Procedure)把我们经常用到的一串复杂sql语句保存成一个数据库对象,并给它起一个名字。每次使用存储过程只需要使用如下的形式即可:exec proc 存储过程名

另外,存储过程还可以带参数运行:

exec proc 存储过程名 参数值[, 参数值...]

(二)存储过程的分类

 1、系统存储过程 system stored procedure 前缀sp_

例如sp_help sp、helpdb

 2、扩展存储过程 extended stored procedure 前缀xp_

例如xp_cmdshell

 3、用户自定义存储过程 user-defined stored procedure

也就是我们自己创建的

(三)用户自定义存储过程的语法

1、创建存储过程

create proc 存储过程名 --无参数的存储过程

as

批处理语句

go

2、修改存储过程

alter proc 存储过程名 --无参数的存储过程

as

批处理语句

go

3、删除存储过程

drop proc 存储过程名

(四)创建存储过程例题

1、创建不带参数的存储过程

例[1]:创建一个“计算机”系学生资料的存储过程proc_1。

CREATE PROCEDURE proc_1

AS

SELECT * FROM STUDENT

WHERE SDEPT=’计算机’ 执行该存储过程,可在查询分析器中执行下面的语句:

EXEC proc_1

2、创建带输入参数的存储过程

输入参数是指由调用程序向存储过程传递的参数。

语法:CREATE PROCEDURE 过程名

@参数名 数据类型= 默认值,

„„„

AS

SQL语句

 @参数名:存储过程的输入参数名,必须以@符号为前缀。执行该存储过程时,应该向输入参数提供相应的值。

[例2]:创建一个按系别查询学生资料的存储过程proc_2,要查询的系名通过执行语句中的输入参数传递给存储过程。

CREATE PROCEDURE proc_2

@dept_name VARCHAR(20)

AS

SELECT * FROM STUDENT

WHERE sdept=@dept_name

执行该存储过程:EXEC proc_2 ‘计算机’

[例3]:创建一个求1到k的和的存储过程 proc_sum.

CREATE proc proc_sum

@k int

AS

DECLARE @i int,@sum int

SELECT @i=1,@sum=0

WHILE @i<=@k

BEGIN

SELECT @sum=@sum+@i

SELECT @i=@i+1

END

select @sum

执行该存储过程:exec proc_sum 100 3、创建带输出参数的存储过程

语法:CREATE PROCEDURE 过程名

@参数名 数据类型= 默认值 [OUTPUT][,„„.]

AS

SQL语句

RETURN

注意:在CREATE PROCEDURE和EXECUTE语句中,都必须使用OUTPUT关键字。

[例4]:创建一个从STUDENT表中查询某位同学的年龄的存储过程proc_3。

CREATE PROCEDURE proc_3

@name VARCHAR(8)=NULL,

@age tinyint OUTPUT

AS

IF @name=NULL

begin

PRINT '查找哪位同学的年龄?'

RETURN

end

ELSE

SELECT @age=SAGE

FROM STUDENT

WHERE SNAME=@name

RETURN

在本例中,存储过程接收两个参数:@name和@age。@age作为输出参数,表示该过程执行结束后,它的值可以返回到调用它的过程中。过程在STUDENT表中找到@name值所在的行,然后把@name相对应的年龄的值存储到@age参数中。

执行存储过程,输出“刘天海”的年龄。

DECLARE @a tinyint

EXEC proc_3 ‘刘天海’,@a OUTPUT

SELECT @a

三、游标

我们可以在存储过程中用Select语句取出每一行数据进行操作,这就需要用到游标。

语法: DECLARE cursor_name CURSOR

[LOCAL | GLOBAL]

[FORWARD_ONLY | SCROLL]

[STATIC | KEYSET | DYNAMIC | FAST_FORWARD]

[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]

[TYPE_WARNING]

FOR select_statement

[FOR UPDATE [OF column_name [,...n]]]

例如:

DECLARE @sno varchar(10), @sname varchar(8) –声明变量

--声明一个游标

DECLARE st_cursor CURSOR FOR

SELECT sno, sname FROM student

--打开游标

OPEN st_cursor

--取出值

FETCH NEXT FROM st_cursor INTO @sno, @sname

--循环取出游标的值

WHILE @@FETCH_STATUS = 0

BEGIN

Print @sno

Print @sname

Print ‘ ’

FETCH NEXT FROM st_cursor

INTO @sno, @sname

END

CLOSE st_cursor –关闭游标

DEALLOCATE st_cursor --释放游标