1. case .... when ...then 用法
select top 10 contact_id,
'contactStatus'= ----------可以不加引号,只是为区别下班的而加,可以用其他任何名字,它是该列的列名
case when contact_status=90 then 'a'
when contact_status=92 then 'b'
else 'c'
end
from contact
2.datadiff( datepart , startdate , enddate ) 求时间差
datapart 可以使year,month,day
3.if else 和case when 区别个人意见
if else
用在这种情况下
create proc #test
as
begin
declare @i int
create table #tb_test(id int primary key)
insert into #tb_test select distinct contact_id from contact where is_noncriminal=1
select @i=count(id) from #tb_test 注意这里,不能写成set @i= select count(id) from #tb_test ,这是错误的
if @i>10 -------if else一般用在这样情况,不能写在select语句里面
begin
print 'a'
end
else
print 'b'
end
go
exec #test
------注意 set @i= ‘select count(id) from #tb_test’ 必须是这样然后,用exec @i 就可以的到其值,这是两种方法
4. set nocount 当on时,不返回计数(表示受T-sql语句影响的行数),当为off时,返回计数
5. @@ROWCOUNT
记住,end 只和begin相配对
6。@@IDENTITY返回插入到表的 IDENTITY 列的最后一个值。这个用返回值很有用
7.游标的使用
整个存储过程
alter proc #test
as
DECLARE report_cursor CURSOR FOR
select top 5 contact_id ,contact_name,display_name from contact
OPEN report_cursor
FETCH NEXT FROM report_cursor---注意它可以一条record 全部得到(包括多列),但是使用时,一定要释放,否则很危险
CLOSE report_cursor
DEALLOCATE report_cursor
go
i,声明一个游标DECLARE report_cursor CURSOR FOR
ii,打开游标OPEN report_cursor
iii,从游标中取值 FETCH NEXT FROM report_cursor
iv,关闭游标 CLOSE report_cursor
v,释放游标 DEALLOCATE report_cursor
8。视图
视图的查询定义必须满足3个条件:
a. 不能在查询定义中使用ORDER BY,除非定义中包含TOP或FOR XML说明符。
b. 所有的结果列必须有名称。
c. 所有结果列的名称必须是唯一的。
通常在SELECT中使用*不是一个好习惯,但你可以在EXISTS谓词中放心使用。
9.视图的修改
修改视图时具有下列限制:
n 只要视图有一列不能隐式获取值,你就不能向视图插入数据。如果列允许NULL、有默认值、设置了IDENTITY属性或类型为ROWVERSION,则说明它可以隐式地获取值。
n 如果视图由一个联接查询(join query)定义,UPDATE或INSERT语句只能影响联接的一端。也就是说,INSERT语句必须定义目标列列表,这些列只能属于联接的一端。同样,UPDATE语句修改的列也必须都属于联接的一端。但是,你可以在查询的其他地方(如赋值语句的右端、查询筛选器等)引用任何列。你不能从由联接查询定义的视图中删除数据。
n 不能修改作为计算结果的列。标量表达式和聚合(aggregate)。SQL Server不会尝试改变数据库引擎的计算结果。
n 如果在创建或修改视图时指定了WITH CHECK OPTION选项,与视图的查询筛选器有冲突的INSERT或UPDTE语句将被拒绝。我将在“视图选项”一节详细描述这一点。
10.如果视图已经存在,使用ALTER VIEW命令比删除后再重建视图要更明智,因为ALTER VIEW可以保持权限。
浙公网安备 33010602011771号