SQL基础4 Carl

--局部临时表:
--临时表的表名有一个前缀#
--临时表只对当前会话有效,只要将连接断开,再次打开则临时表就没有了。

--如果临时表是在存储过程中创建的,则当存储过程执行完毕,则自动销毁。类似于c#变量的作用域范围。
--

--全局临时表:
--前缀##
--多个会话中可以共享全局临时表
--只有创建该表的会话断开时才会删除全局临时表,如果这时,正有其他会话在访问该临时表,则会等待该会话结束后删除临时表。

create table #student
(
 username nvarchar(10),
 age int
)
create table ##quanjustudent
(
  username nvarchar(10),
  age int
)
--表变量
declare @T1 table(c1 int,c2 int);
insert into @t1 values(1,2)
select * from @t1

--在视图中的查询语句,必须为每一列建一个列名
create view vw1
as
select
tsname,
case
  when tsage>50 then '豆蔻年华'
 else '青壮年'
end as '外号'
from tblstudent
select * from vw1

--在视图中不能使用order by语句。除非:除非另外还指定了 TOP 或 FOR XML
--错误的写法
create view vw2
as
select * from tblstudent order by tsid desc
--正确的写法
create view vw2
as
select top 10 * from tblstudent order by tsid desc

--=======声明变量----
declare @name varchar(10)
declare @age int
set @name='abc'
set @age=1
print @name
print @age

declare @userAge int
-------------=使用set与select为变量赋值的区别============
--当使用set为变量赋值时,如果右边返回多个值,则“报错”。
 set @userAge=(select tsage from TblStudent)
 print @userAge

declare @userAge int
 --当使用select为变量赋值时,如果右边返回多个值,则始终以最后一个为准
 select top 5  @userAge=tsage from TblStudent
 print @userAge


declare @age int
 --一开始变量没有赋值的时候为null,null与任何类型计算得到的结果还是null
 --所以和建议声明变量的时候一定要赋初值。
 set @age=@age+1
 select @age --所以这里输出还是null


----------事务--
begin tran
declare @sum int
update bank set salary=salary+1000 where id=1
set @sum+=@@error
update bank set salary=salary-1000 where id=2
set @sum+=@@error
if @sum<>0
begin
-- 回滚
  rollback
end
else
begin
--提交
  commit tran
end

--隐式事务
SET IMPLICIT_TRANSACTIONS  ON
--关闭数据库的隐式提交
SET IMPLICIT_TRANSACTIONS  OFF


------------存储过程-----------
---分页存储过程
create proc fenye
@size int,
@index int,
@total int output
as

  select * from 
(
  select *, row_number() over(order by tsid) as number from tblstudent
)as T
where T.tsid between (@index-1)*@size+1 and @index*@size

select @total=count(1) from tblstudent

declare @cont int
exec fenye 2,2,@cont output
print @cont

--sql server中的触发器是表级触发器,无论删除多少行或者插入多少行,只触发一次。
--是按语句来触发的,每次执行一次语句,触发一次触发器。
--不会每一条语句都触发
create trigger tri_tblclass_insert_after
on tblclass after insert
as
declare @classid int
declare @classname varchar(20)
select @classid=tclassid,@classname=tclassname from tblclass
print @classid
print @classname

insert into tblclass values('你懂的','还能有啥哇')


--当使用instead of 触发器以后,原来的删除操作被替换成了:
--insert into TblClassBak select * from deleted
create trigger tri_TblClass_delete_instead_of
on TblClass instead of delete
as
begin
 
 insert into TblClassBak
 select * from deleted
end

原文地址:https://www.cnblogs.com/sc0791/p/2655671.html