日期:2014-05-17  浏览次数:20564 次

【SQL SERVER中一些特别地方的特别解法2】
本帖最后由 feixianxxx 于 2010-04-21 21:37:34 编辑
详见博客地址:http://blog.csdn.net/feixianxxx/archive/2010/04/21/5513256.aspx
/*----------------------------
-- Author  :feixianxxx(poofly)
-- Date    :2010-04-20 20:10:41
-- Version:
--      Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86) 
Mar 29 2009 10:27:29 
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Evaluation Edition on Windows NT 6.1 <X86> (Build 7600: )
-- CONTENT:SQL SERVER中一些特别地方的特别解法2
----------------------------*/

--1.关于where筛选器中出现指定星期几的求解
--环境
create table test_1
(
id int,
value varchar(10),
t_time datetime
)
insert test_1 
select 1,'a','2009-04-19' union 
select 2,'b','2009-04-20' union 
select 3,'c','2009-04-21' union 
select 4,'d','2009-04-22' union 
select 5,'e','2009-04-23' union 
select 6,'f','2009-04-24' union 
select 7,'g','2009-04-25' 
go
我们一般通过 datepart(weekday )进行求解,比如求解星期2的记录
select * from test_1
where DATEPART(WEEKDAY,t_time+@@DATEFIRST-1)=2
/*
id          value      t_time
----------- ---------- -----------------------
3           c          2009-04-21 00:00:00.000
*/
这里涉及到 @@datefirst 这个系统变量,一般我们用来调节不同地方的日期习惯。
如果你觉得关于这个变量很难也懒得去依赖它调节,这里还有一种方法

你可以使用一个参照日期,通过相同星期数成7的倍数的原理进行查询
select * from test_1 
where DATEDIFF(DAY,'1900-01-02',t_time)%7=0
/*
id          value      t_time
----------- ---------- -----------------------
3           c          2009-04-21 00:00:00.000
*/



--2.关于在where筛选器中指定大小写查找的索引引用问题
--环境
--drop table test_2
create table test_2
(
id int identity(1,1),
value varchar(10)
)
insert test_2 select 
'abc' union all select 
'Abc' union all select 
'ABC' union all select 
'aBc' 
go
create  clustered index in_value on test_2(value)
--我先要查找 值为'ABC'的记录 要区分大小写的
select * from test_2
where value COLLATE CHINESE_PRC_CS_AS ='ABC'
按CTRL+L看执行计划 发现时聚集索引扫描 这就说明它不是SARG,不考虑使用索引
解决方法:
select * from test_2
where value COLLATE CHINESE_PRC_CS_AS ='ABC' 
and value='ABC'
go
看执行计划,结果是聚集索引查找;



--3.自动全局临时表
在某些情况下,你可能需要跨会话的维护一些共享值,这里可以通过一些手段自动建立这样一个全局临时表够你使用
具体方法就是在master数据库中建立一个以sp_开头的特殊存储过程,并且使用'startup'标志此存储过程,这样每次重启数据库后都会自动运行此存储过程,
通过在存储过程中建立全局临时表,就达到了共享全局表的目的。
create proced