declare democursor cursorfor select UserName,UserPass FROM UserInfo --打开游标 open democursor --定义几个变量 declare@UserName nvarchar(32) declare@UserPass nvarchar(32) --把游标指向的数据取出来,把数据放到后面的三个变量中 fetch next from democursor into@UserName,@UserPass--这里只是拿到它的第0行数据
while(@@FETCH_STATUS=0)--@@FETCH_STATUS=0的时候表示,取数据成功 begin print @UserName print @UserPass print '----------' fetch next from democursor into@UserName,@UserPass end close democursor --记得关闭游标,但是可以继续打开游标 deallocate democursor --释放游标,释放之后就不能open了
视图
1 2 3
--02 视图 createview VM_UserInfo asselect*from UserInfo where ID>15 --select * from VM_UserInfo
临时表
简单点说临时表就是在创建表的时候加上**#**符号,临时表会在会话结束的时候删除。
1 2 3 4
--03 临时表 --select * into #TB from userinfo --常用的创建临时表的做法 --select * from #TB --drop table #TB --必须释放临时表
select*into #Orders from [Orders] as e select*into #OrderBook from [OrderBook] as p
select ID , bookid from #Orders as E leftjoin #OrderBook as p on e.OrderID=p.OrderId
注意以上这些都是非全局表,全局表是两个#,##Orders这样,所有人都能访问的全局表、
事务
这里顺便提点一些sql里面的错误判断,也是try,catch
1 2 3 4 5 6 7 8 9
begin tran --开启一个事务 begin try update userinfo set UserName=N'牛逼'where id=3 update userinfo set RegTime=N'牛逼'where id=3--这里肯定报错,因为我们这个时间不是字符串类型 commit tran--提交一个事务 end try begin catch rollback tran--回滚一个事务 end catch
try { using (TransactionScope scope = new TransactionScope()) { using (SqlConnection conn = new SqlConnection(ConnectionStr())) { using (SqlCommand command = conn.CreateCommand()) { conn.Open(); command.CommandText = @" update userinfo set UserName=N'牛逼' where id=3
update userinfo set RegTime = N'牛逼' where id = 3"; command.ExecuteNonQuery();
--先判断有没有这个存储过程存在 if(exists(select*from sys.all_objects where name='Pro_UserInfo_GetPageUserInfos')) drop proc Pro_UserInfo_GetPageUserInfos go
--创建储存过程 create proc Pro_UserInfo_GetPageUserInfos @PageSizeint, @PageIndexint, @TotalCountint output as select*from (select*,row_number() over(orderby ID asc) as RowNum from UserInfo) as T where T.RowNum between ((@PageIndex-1)*@PageSize+1) and (@PageSize*@PageIndex) --给输出变量赋值 select@TotalCount=count(1) from UserInfo
create function FUN_GetPassNum(@IDnum int) returns int as begin declare @num int set @num=(selectcount(1) from UserInfo where Id>@IDnum) return @num end
select dbo.FUN_GetPassNum(20)
我们在写存储过程的时候可以写方法调方法
表值函数,也就是返回值是table,但是不能用begin end
触发器
1 2 3 4 5 6 7 8 9 10
createtrigger TR_TestTrigger on UserInfo forinsert as begin declare@IDint select@ID=Id from inserted --它是一张表 update UserInfo set UName=UName+'sasas'where ID=@ID end
createtrigger TR_TestTrigger_Delete on UserInfo instead ofdelete as begin declare@IDint select@ID=Id from deleted --它是一张表 update UserInfo set DelFlag=1where ID=@ID end