视图
视图是虚表,是一组sql语句查询的结果集,没有物理表,所以不能对视图做insert,
Update delete 操作,在引用视图的时候动态产生数据集。
优点:
1、 就是根据特定的业务需求,定制业务数据
2、 简化操作 特别是多表关联的时候,好的视图可以带来快的开发速度
3、 安全性,给视图设置权限Grant
缺点:
1、 由于不物理表,当用户需要修改视图关联的各表数据的时候就会很麻烦,特别是数据由有很多表关联出来的情况下。对于这点我也没什么好办法。
视图的语法
Create View [ViewName]
As
Select * from db.TableName //这里可以写复杂的select 语句
这样就定义了一个名字叫ViewName 的视图,需要使用的话可以用
Select * from [ViewName]
也可以加上限制条件
Select * from [ViewName] as A where A.字段名=条件
还有的时候我们是需要视图修改一些字段的含义的,例如数据库里的sex 字段你可能
存储的是0,1这种bit 数据,但是你不希望展示给用户的是0,1,这种情况下就有两种解决方法,一种是在展现的时候在代码里转换,一种是在数据库里头转换
Select A.name,A.sex,(
Case A.sex
When 0 then ‘男’
When 1 then ‘女’
end) as sexname
from [tablename] A
存储过程
存储过程, 是一组为了完成特定功能的SQL 语句,集经编译后存储在数据库中。存储过程的写法类似高级编程语言。
优点:
- 存储过程预先在服务器上编译,代码运行会比T-sql快,下次运行会在内存中找
- 存储过程不需要客户端传好多数据过来,减少带宽的消耗
- 更好维护,减少代码的修改量
- 安全性高,可对存储过程的使用做权限控制,同时传过来的参数会做参数化,一定程度上可以防止注入(没试过,一般要自己过滤掉)
缺点:
1. 可移植性很差
视图的语法
Create proc test(
//定义输入输出参数
)
As
代码段
Go
使用存储过程 Exec test 参数
下面写一个分页的代码段
方式一:(错误的方式,但是很经典)
Create proc getpagedata(
@pageIndex int,
@pageSize int
)
As
select top @pageSize * from(select ROW_NUMBER() OVER (ORDER BY a.TypeName ASC) AS rowid ,a.* from HP0003 a )t where t.rowid>@pageSize*@pageIndex
方式二:正确的写法
create proc getpagedata(
@pageIndex int,
@pageSize int,
@rowcount int output
)
As
begin
declare @str_sql varchar(700)
select @rowcount= count(*) from HP0003
select @str_sql='select top '+cast(@pageSize as varchar)+' t.* from (select ROW_NUMBER() OVER (ORDER BY a.TypeName ASC) AS rowid ,a.* from HP0003 a ) t
where t.rowid>'+cast(@pageSize*@pageIndex as varchar)
exec (@str_sql)
end
使用 exec getpagedata 1,2
另外还有一种有输出参数的
Create proc getrowcount(
@rowcount int output
)
As
Select @rowcount=count(*) from [Tablename]
使用方式
declare @rowcount int
exec getrowcount @rowcount output
print @rowcount
或者
declare @rowcount int
exec getrowcount @rowcount output
select @rowcount as count
存储过程中经常还有中情况就是查询是有流程控制的,下面是一种简单的流程控制的例子
CREATE PROCEDURE [dbo].[GetXS0330](
@DJID int,
@UserID int,
@StarDate datetime,
@EndDate datetime
)
as
begin
Declare @ls_sql varchar(5000),@ls_sql02 varchar(5000)
IF isNull(@DJID,'0')='0' Select @DJID=1
Select @ls_sql02 = ' where 1=1 '
Select @ls_sql02 = @ls_sql02 + ' and datediff(D,Date60,'''+ Cast(@StarDate as varchar) +''')<=0 '
select @ls_sql02 = @ls_sql02 + ' and datediff(D,Date60,'''+ Cast(@EndDate as varchar) +''')>=0 '
IF isNull(@UserID,'')<>''
Begin
select @ls_sql02 = @ls_sql02 + ' and UserID = '''+ Cast(@UserID as varchar) +''' '
End
Else
Begin
select @ls_sql02 = @ls_sql02 + ' and UserID in '
select @ls_sql02 = @ls_sql02 + ' ('
select @ls_sql02 = @ls_sql02 + '
Select UserID from V_XS0006B where DJ in (2,3,4) and (DJID03='''+ Cast(@DJID as varchar) +''' '
select @ls_sql02 = @ls_sql02 + ' OR DJID03 in (Select DJID from XS0014 where GXID='''+ Cast(@DJID as varchar) +''')) '
select @ls_sql02 = @ls_sql02 + ' ) '
End
Select @ls_sql='Select * from V_XS0330 '+@ls_sql02
Exec(@ls_sql)
End
函数很类似于存储过程,区别于函数可以在select 里使用,而存储过程
不能,下面这张图说明了一些区别(网上找到的)
刚实习,写的不是很好,文章也没怎么组织,晚上有时间在调整下。有错误的给个提示,我数据库的环境是MS SQL2005,刚出来就应该好好的学习!每天都有事做,留给自己的学习的时间久越少了!我们是否还能坚持自己对技术的
热爱就看我们自己了。希望自己能过好这一段时间,好好的学一点技术!自己表达也不是很好,每次打算写一篇的时候都是
写了一半就写不下去了,第一是觉得没什么写的,技术太差。第二,就是写着写着,就不知道怎么写了!其实很想分享自己的
所学到的东西!让有需要的人更快的获取到这部分知识!我从博客也学到了很多,希望自己也能做出一点贡献!