SQL Server学习总结(2)

SQL编程

1.局部变量

Declare @variable_name DataType

例:declare @name varchar(20)--声明存放姓名变量name,最多可以存储20个字符

2.给变量赋值

Set @variable_name = value

Select @variable_name=value

3.print语句和select语句

Print 局部变量或字符串

select 局部变量 as 自定义列名

例:

Print '服务器的名称:'+@@servername

Select @@servername as '服务器的名称'

4.数据类型转换(Cast()和Convert()函数)

Cast(表达式 as 数据类型)

Convert(数据类型[长度] ,长度[,样式])

例:

Cast(@Result as varchar(10))

Convert(varchar(20),@@error)

5.Begin-End语句

Begin

语句或语句块

End

6.IF-ELSE语句

IF(条件)

语句或语句块1

ELSE

语句或语句块2

7.WHILE语句

WHILE(条件)

Begin

语句或语句块

[break|continue]

End

8.CASE多分支语句

CASE

WHEN 条件1 THEN 结果1

WHEN 条件2 THEN 结果2

[ELSE 其他结果]

END

高级查询

1.子查询

Select ........ From 1 where 1>(子查询)

例:

Select * from student where age>(select avg(age) from student)

2.IN 和 NOT IN子查询

3.EXISTS 和 NOT EXISTS子查询

4.使用UNION联合查询

事务、视图、索引、存储过程

1.事务(Transaction

a) 原子性:不可分割。

b) 一致性:当事务完成时,数据必须处于一致状态。

c) 隔离性:对数据进行修改的所有并发事务是彼此隔离的。

d) 持久性:不管系统是否发生了故障,事务处理的结果都是永久的。

语法:

Begin transaction --显示的标记一个事务的起始点

Commit transaction --这个语句标志一个事务成功结束。

Rollback transaction --将数据状态回滚到事务起始点,并释放由事务控制的资源。

例:

Use myschool

Go

 

Set nocount no --不显示受影响的行数

Print '查看转账事务前的余额'

Select * from bank

Go

 

--开始事务

Bengin transaction

Declare @errorNum=0

Update bank set currentMoney=currentMoney-1000 where customerName='张三'

Set @errorNum=@errorNum+@@error

Update bank set currentMoney=currentMoney+1000 where customerName='李四'

Set @errorNum=@errorNum+@@error

Print '查看转账事务过程中的余额'

Select * from bank

Go

 

--根据是否有错误,确定是提交还是撤销

If @@errorNum>0

Begin

Print '交易失败,回滚事务'

Rollback transaction

End

Else

Begin

Print '交易成功'

Commit transaction

End

Go

 

Print '查看转账事务后的余额'

Select * from bank

go

2.视图(View

创建视图语法:

Create view view_name

As 

<select 语句>

删除视图语法:

Drop view view_name

例:

If exists(select 1from sysobjects where name='vw_CardCostomer')

Drop view vw_CardCostomer

Go

--创建视图

create view vw_CardCostomer

as

select CardID 卡号, c.CustomerName 客户姓名, PassWord 密码, MoneyType 货币, bs.TypeName 储蓄种类,OpenCardDate 开户日期, OpenCardMoney 开户金额, case 

when IsActive ='' then '挂失'

when IsActive ='' then '未挂失

end 是否挂失

 from BankCard b

 inner join Customer c on c.CustomerID=b.CustomerID

 inner join BankSaveGetType bs on bs.TypeID=b.SaveTypeID

 Go

3.存储过程(procedure

优点:

A)模块化程序设计

B)执行速度快,效率高

C)减少网络流量

D)具有良好的安全性

分类:系统存储过程(sp_)、用户自定义的存储过程(up_)

常用系统存储过程

A)Exec sp_databases --列出当前系统中的数据库

B)Exec sp_renamedb 'mybank','bank' --改变数据库名称

C)Exec sp_tables --当前数据库中可查询对象的列表

D)Exec sp_colums student --查看表student中列的信息

E)Exec sp_help student --查看student的所有信息

F)Exec sp_helpconstraint student --查看student表中的约束

G)Exec sp_helptext 'view_student_result' --查看视图的语句文本

H)Exec sp_stored_procedures --返回当前数据库中的存储过程列表

创建和删除存储过程

注:只要存储过程后面有output关键字,表示此参数为输入参数,否则视为输入参数,输入参数还可以设置为默认值。

语法:

Create proc[edure] 存储过程名

[

{@参数数据类型}[=默认值][output],

..................................................

{@参数数据类型}[=默认值][output]

]

As 

SQL语句

 

例:

--存取钱存储过程

if exists(select 1 from sys.objects where name='up_ChangeMoney')

drop proc up_ChangeMoney

go

create proc up_ChangeMoney

@CardID varchar(32),

@ChangeDate datetime,

@ChangeMoney money,

@ChangeTypeName varchar(10),

@ChangeNote varchar(100)

as 

begin tran

declare @ErrorSum int=0

declare @ChangeTypeID int

set @ChangeTypeID=(select TypeID from ChangeType where TypeName=@ChangeTypeName)

if (@ChangeTypeName='存入')

begin

print '交易正在进行中.....'

update BankCard set Banlance=Banlance+@ChangeMoney where CardID=@CardID

set @ErrorSum=@ErrorSum+@@error

insert into ChangeMsg  values(@CardID,@ChangeDate,@ChangeMoney,@ChangeTypeID,@ChangeNote)

set @ErrorSum=@ErrorSum+@@error

end

else

begin

update BankCard set Banlance=Banlance-@ChangeMoney where CardID=@CardID

set @ErrorSum=@ErrorSum+@@error

if(@ErrorSum>0)

begin

RAISERROR ('交易失败!余额不足!',16,1)

end

Insert into ChangeMsg  values(@CardID,@ChangeDate,@ChangeMoney,@ChangeTypeID,@ChangeNote)

set @ErrorSum=@ErrorSum+@@error

end

if(@errorSum=0)

begin 

print @ChangeTypeName+'金额成功'

commit tran

end

else

begin 

print '操作失败'

rollback tran

end

Go