七月 | 2011 | 享受代码
2011年7月 的存档
2011七月27

快递范围自动筛选

sql server 评论关闭

快递范围自动筛选:根据客户地址筛选合适快递。

建表ExpressScope:
ExpressID,SendArea,NoSendArea

快递筛选:要明确地址信息的方可筛选
对于快递范围表数据填充ExpressScope方式:
1,服务区域明确
SendArea为每个确切地址,NoSendArea为空
2,服务区域不明确,不服务区域明确
SendArea为空,NoSendArea为每个确切的地址或关键字如村
3,服务区域不明确,不服务区域不明确
如服务区域:县城城区地域派送 不服务区域:县城外均不操作
此类不能执行自动筛选,范围不入ExpressScope。

筛选方式:
CHARINDEX(SendArea,@Address) >0
AND CHARINDEX(NoSendArea,@Address) =0

2011七月27

CAST与CONVERT

sql server 评论关闭

1,性能:二者一样。
2,区别:CAST 是ANSI标准,Convert不是。CAST对于转换指定日期格式上不满足,而Convert可以。
3,实现上,在MsSql中CAST由Convert实现,即通过:
SELECT CAST ( o.[object_id] AS int)
FROM sys.objects o
在Compute Scalar的属性中查看:
[Expr1037] = 标量运算符(CONVERT(int,[master].[sys].[sysschobjs].[id] as [o].[id],0))
参考:

http://beyondrelational.com/blogs/nakul/archive/2011/07/18/cast-v-s-convert-is-there-a-difference-as-far-as-sql-server-is-concerned-which-is-better.aspx

2011七月16

mssql特殊符号处理

sql server 评论关闭

在利用SELECT REPLACE(‘密水街办?’,'?’,”)发现得到的结果仍为密水街办?,没用将?去掉。
再用SELECT CHECKSUM(‘?’),CHECKSUM(”) 发现得到的结果都是0,说明二者并没有得到区分.
通过改变编码格式解决: SELECT REPLACE(‘密水街办?’ collate Chinese_PRC_BIN2,’?',”)
查看mssql支持的编码:select * from ::fn_helpcollations()

详细:
mssql默认中文的编码为:Chinese_PRC_CI_AS即:
Chinese-PRC, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive
unicode字符集Chinese-PRC 大陆简体字,大小写不敏感,重音敏感,假名类型敏感,全角半角不敏感
_BIN 二进制排序
_CI(CS) 是否区分大小写,CI不区分,CS区分
_AI(AS) 是否区分重音,AI不区分,AS区分   
_KI(KS) 是否区分假名类型,KI不区分,KS区分 
_WI(WS) 是否区分宽度 WI不区分,WS区分

假名类型:平假名是日语中表音符号的一种
重音:英文单词中的重音,如 ,’a'不等同于’á’。
用得最多的是大小写是否区分,全角是否区分,默认都是不区分

可看到默认全角半角,大小写不区分,若想区分,采用编码转换
IF (‘@’ = ‘@’ collate Chinese_PRC_CI_AS_WS)
PRINT ‘y’
ELSE PRINT ‘n’

2011七月15

防止js文件缓存

javascript 评论关闭
<script language="javascript"  type="text/javascript">
//防止js文件缓存下来,以后更新时不再需要用户重新删除IE文件等操作。
var now=new Date();
var number = now.getYear().toString()+now.getMonth().toString()+now.getDate().toString()+now.getHours().toString()+now.getMinutes().toString()+now.getSeconds().toString();
document.write("\<script language=\"javascript\" type=\"text/javascript\" src=\"../LodopPrint/ExpressPrint.js?"+number+"\"><\/script\>");
//alert("\<script language=\"javascript\" type=\"text/javascript\" src=\"js/YearReportLuRu.js?"+number+"\"><\/script\>");//测试
</script>
 查看IE文件,文件形式为ExpressPrint.js?2011615105127
这样浏览器就会以为每次引用的js文件都是不同的,当然对ExpressPrint.js对后面的动态数并不进行处理。
2011七月9

遍历所有表、遍历所有数据库

sql server 评论关闭
系统存储过程sp_MSforeachtable和sp_MSforeachdb,是微软提供的两个不公开的存储过程,从mssql6.5开始。存放在SQL Server的MASTER数据库中。可以用来对某个数据库的所有表或某个SQL服务器上的所有数据库进行管理
参数说明:

   @command1 nvarchar(2000),                      --第一条运行的SQL指令
   @replacechar nchar(1) = N'?',                      --指定的占位符号,默认为?
   @command2 nvarchar(2000)= null,            --第二条运行的SQL指令
   @command3 nvarchar(2000)= null,            --第三条运行的SQL指令
   @whereand nvarchar(2000)= null,               --可选条件来选择表
   @precommand nvarchar(2000)= null,        --执行指令前的操作(类似控件的触发前的操作)
   @postcommand nvarchar(2000)= null       --执行指令后的操作(类似控件的触发后的操作)

   以后为sp_MSforeachtable的参数,sp_MSforeachdb不包括参数@whereand

如:查询当前数据库中所有以bd开头的表的容量

查询一条用:sp_spaceused

多条用:
CREATE TABLE #TableSpaceUsed(
TableName SYSNAME,
Rows INT,
Reserved VARCHAR(20),
DataSize VARCHAR(20),
IndexSize VARCHAR(20),
UnUsed VARCHAR(20))

EXEC sp_MSForEachTable
@command1=N'insert into #TableSpaceUsed exec sp_spaceused ''?''',@whereand='and o.name like ''%'''

SELECT * FROM #TableSpaceUsed
ORDER BY CONVERT(INT,REPLACE(Reserved,' KB','')) DESC
--更新PUBS数据库中已t开头的所有表的统计: EXEC sp_MSforeachtable @whereand="and name like 't%'", @replacechar='*', @precommand="print 'Updating Statistics.....' print ''", @command1="print '*' update statistics * ", @postcommand= "print''print 'Complete Update Statistics!'" --遍历数据库文件

--遍历数据库文件
CREATE TABLE #DataBaseFiles(
DB SYSNAME,
LogicName SYSNAME,
physical_name nvarchar(260),
FILENAME nvarchar(260),
FileSize DECIMAL(18,1)
)

--要用user ? 否则返回的结果仍是当前库的数据
EXEC sp_MSforeachdb 'USE ?  insert into #DataBaseFiles SELECT ''?'',name, substring(filename,len(filename) - charindex(''\'', reverse(filename))+2,charindex(''\'', reverse(filename))),filename, CONVERT(DECIMAL(18,1),(size*8.0/(1024*1024))) AS Size_GB FROM sys.sysfiles '

SELECT *
FROM #DataBaseFiles

Run same command on all SQL Server databases without cursors
2011七月8

JOIN探讨

sql server 评论关闭

1, tableA JOIN tableB ON …
对于tableA与tableB满足ON条件的抓出。
过程模拟:对于tableA的每一行记录,遍历tableB的每行记录,若tableA与tableB的当前记录都满足ON条件,那么将tableA与tableB的当前记录取出,遍历完之后,若有LEFT,JOIN之类,则在取出的结果表中再加上没有满足条件的tableA外行即可。
即:LEFT JOIN 与 JOIN的区别在于:在对ON条件执行过滤后,是否再增加外行。
2,理解
1)
tableA JOIN tableB ON 1=1 :对于tableA与tableB的每一条记录,都满足1=1故相当于求tableA与tableB的笛卡儿积。
tableA LEFT JOIN tableB ON 1=1: 对于tableA与tableB的每一条记录,都满足1=1,抓取出。然后将不满足条件的tableA的行取出加上,但tableA所有记录都满足条件,故增加的外行为0 即此时:LEFT JOIN = JOIN
2) tableA JOIN tableB ON tableA.id = 1 :将tableA ID为1的与tableB所有记录连接。
tableA LEFT JOIN tableB ON tableA.id = 1 :将tableA ID为1的与tableB所有记录连接,然后再将tableA ID不为1的加上。

3) on 后的条件为>=或<=时,可用来求解阶梯问题。

2011七月7

sql集合属于等于判断方法

sql server 评论关闭
/*1,判断集合A是否属于集合B
* 2,判断集合A是否等于集合B
若集合wa属于集合wb,那么wa的任意一个元素都会在集合wb中存在,并且wb的元素数量要>=wa的元素数量*/

WITH wa AS (
SELECT 'a1' product
UNION ALL
SELECT 'b2'
),
wb AS (
SELECT 'Ta' TYPE,'a1' product
UNION ALL
SELECT 'Ta' ,'b2'
UNION ALL
SELECT 'Tb' ,'a1'
UNION ALL
SELECT 'Tb' ,'b2'
UNION ALL
SELECT 'Tb' ,'c3'
UNION ALL
SELECT 'Tc' ,'a1'
UNION ALL
SELECT 'Td' ,'b2'
UNION ALL
SELECT 'Td' ,'c3'
UNION ALL
SELECT 'Te' ,'a1'
UNION ALL
SELECT 'Te' ,'a1'
UNION ALL
SELECT 'Tf' ,'a1'
UNION ALL
SELECT 'Tf' ,'d1'
)

/*若集合wa属于集合wb,那么wa的任意一个元素都会在集合wb中存在,并且wb的元素数量要>=wa的元素数量*/

/* 1,集合属于判断*/
SELECT b.type
FROM wb b(NOLOCK)
JOIN wa a(NOLOCK) ON b.product = a.product  --取出至少包含wa一个元素的所有集合
GROUP BY b.type
HAVING COUNT(DISTINCT b.product) = (SELECT COUNT(1) FROM wa) --保证wa的任意一个元素都会在集合wb中存在                                                         --
ORDER BY b.type

/*2,集合等于判断
SELECT b.type
FROM wb b(NOLOCK)
JOIN wa a(NOLOCK) ON b.product = a.product  --取出至少包含wa一个元素的所有集合
WHERE  ( SELECT COUNT(1) FROM wb WHERE wb.type = b.type  ) = ( SELECT COUNT(1) FROM wa) --集合数量要相等
GROUP BY b.type
HAVING COUNT(DISTINCT b.product) = (SELECT COUNT(1) FROM wa) --保证wa的任意一个元素都会在集合wb中存在                                                               --
ORDER BY b.type

*/
2011七月6

SQL SERVER2005 自动安装

sql server 评论关闭

参考:http://technet.microsoft.com/zh-cn/library/ms144259(SQL.90).aspx
运行:start /wait setup.exe /qb /settings setup.ini (注:setup.exe最好是SQL Server x86\Servers下的)
start /wait :dos命令,启动应用程序并等待它结束。
setup.ini可参考\SQL Server x86\Servers下的template.ini文件
注:其中的/qb表示可看见安装画面,若改为/qn则完全在后台运行安装
setup.ini配置:
[Options]
USERNAME=user
COMPANYNAME=lvshou
PIDKEY=B4H74BJX3P37RX2J9TTBH9RMJ
INSTALLSQLDIR=”C:\Program Files\Microsoft SQL Server\”
INSTALLOLAPDATADIR=”C:\Program Files\Microsoft SQL Server\MSSQL\OLAP\Data”
ADDLOCAL=All
INSTANCENAME=MSSQLSERVER
SECURITYMODE=SQL
SAPWD=LifeIsGood
SQLACCOUNT=NT AUTHORITY\SYSTEM
AGTACCOUNT=NT AUTHORITY\SYSTEM
SQLBROWSERACCOUNT=NT AUTHORITY\SYSTEM
ASACCOUNT=NT AUTHORITY\SYSTEM
RSACCOUNT=NT AUTHORITY\SYSTEM
SQLBROWSERAUTOSTART=1
SQLAUTOSTART=1
AGTAUTOSTART=1

注:INSTALLOLAPDATADIR,数据库文件(如.mdf和.ldf)的默认存放目录
ASACCOUNT:Analysis Services
RSACCOUNT:Reprot Services
SQLBROWSERAUTOSTART=1 1为自动启动,0为手动启动。
SQLAUTOSTART=1
AGTAUTOSTART=1
SECURITYMODE=SQL :身份验证模式,当为sql时表示混合验证,若未指定,则是windows验证

SQLServer2005SP3-KB955706-x86-CHS.exe /quiet /allinstances

2011七月4

NOT IN 与 NULL

sql server 评论关闭

对于结果集包含NULL的情况:
1,当用IN时,若在结果集中存在,则返回TRUE,若在结果集中不存在,因结果集中有NULL,则返回UNKNOWN, UNKNOWN类似于False,故用IN可返回TRUE或False,同用Exists一样。
2,用IN时,返回TRUE或UNKNOWN,那么用NOT IN时,就返回NOT TRUE 或NOT UNKNOWN 即:False或NOT UNKNOWN,因NOT UNKNOWN = UNKNOWN,类似于False,故对于结果集包含NULL时,会一直返回False!即一直没有结果。
故:当当用NOT IN时,若不能保证结果集一定没有NULL,则最好用NOT EXISTS