2009年12月5日
#
SQL Server 2000实现一则按类似VB VAL函数功能排序的案例
最近,在项目维护时,碰到对以下的数据进行排序处理:
排序前:
班级 照片名称
机械1班 1张三.jpg
机械1班 7李四.jpg
机械1班 3王五.jpg
财会2班 3如花.jpg
财会2班 6像花.jpg
财会2班 1真花.jpg
体育1班 3铁男.jpg
体育1班 1猛男.jpg
财会2班 10若花.jpg
体育1班 30衰男.jpg
排序后(要实现的结果):
班级 照片名称
财会2班 1真花.jpg
财会2班 3如花.jpg
财会2班 6像花.jpg
财会2班 10若花.jpg
机械1班 1张三.jpg
机械1班 3王五.jpg
机械1班 7李四.jpg
体育1班 1猛男.jpg
体育1班 3铁男.jpg
体育1班 30衰男.jpg
也许有人会说,这还不简单,只要输入"SELECT 班级, 照片名称 FROM [Table] ORDER BY 班级, 照片名称"语句,不就出结果了吗?事实如此吗,请看此SQL语句执行后的结果:
班级 照片名称
财会2班 10若花.jpg
财会2班 1真花.jpg
财会2班 3如花.jpg
财会2班 6像花.jpg
机械1班 1张三.jpg
机械1班 3王五.jpg
机械1班 7李四.jpg
体育1班 1猛男.jpg
体育1班 30衰男.jpg
体育1班 3铁男.jpg
是不是与预期的结果有很大的出入呢? 怎样解决这问题,实现想要的结果呢?由于SQL Server没有类似VB的VAL函数,因此想实现如上数据的排序,将比较困难。不过,只要执行以下SQL语句就可以了,今天免费赠送了。废话少说,亮代码:
SELECT 班级, 照片名称
FROM (SELECT *, CASE WHEN (UNICODE(SUBSTRING(photo, 1, 1)) BETWEEN 48 AND
57) AND NOT (UNICODE(SUBSTRING(photo, 2, 1)) BETWEEN 48 AND 57)
THEN SUBSTRING(photo, 1, 1) WHEN (UNICODE(SUBSTRING(photo, 1, 1))
BETWEEN 48 AND 57) AND (UNICODE(SUBSTRING(photo, 2, 1)) BETWEEN
48 AND 57) THEN SUBSTRING(photo, 1, 2) END AS photoid
FROM (SELECT *, LTRIM(照片名称) AS photo
FROM [TABLE]) l) ll
ORDER BY 班级, CAST(ISNULL(photoid, 0) AS int)
没想到一个简单的功能,要写这么复杂的代码。看来,前人"造轮子"没造全,将会给后面的应用开发人员带来不小的烦恼。
2009年11月23日
#
--SQL Server TEXT类型字段字符串替换示例处理脚本
/*--text字段的替换处理
--*/
--创建数据测试环境
--create table #tb(aa text)
declare @s_str varchar(8000),@d_str varchar(8000), --定义替换的字符串
@p varbinary(16),@postion int,@rplen int,@i_Start int, @i_End int
select identity(int,1,1) as [id],newsid into # from news
select @i_Start=min([id]),@i_End=max([id]) from #
while (@i_Start<=@i_End)
begin
--insert into #tb(aa) select content from # where [id]=@i_Start
select @s_str='\' --要替换的字符串
,@d_str='!' --替换成的字符串
--字符串替换处理
select @p=textptr(content),@rplen=len(@s_str),@postion=charindex(@s_str,content)-1 from news where newsid in (select top 1 newsid from # where [id]=@i_Start)
while @postion>0
begin
updatetext news.content @p @postion @rplen @d_str
select @postion=charindex(@s_str,content)-1 from news where newsid in (select top 1 newsid from # where [id]=@i_Start)
end
--truncate table #tb
select @i_Start=@i_Start+1
end
--删除数据测试环境
--drop table #tb
drop table #
2009年3月25日
#
--
获取SQL Server服务器的连接信息用脚本(在原邹建写的基础上作一点改进)
declare
@dbname sysname,
--要查询的数据库名(为空为所有),默认查询所有数据库的连接信息
@includeip bit
--是否显示IP地址(0否,1是),因为查询IP地址比较费时,所以增加此控制
select @dbname=null,@includeip=1
declare @dbid int
set @dbid=db_id(@dbname)
create table #tb
(id int identity(1,1),dbname sysname,hostname nchar(128),loginname nchar(128),
net_address nchar(12),net_ip nvarchar(15),prog_name nchar(128))
insert into #tb(hostname,dbname,net_address,loginname,prog_name)
select distinct hostname,db_name(dbid),net_address,loginame,program_name
from master..sysprocesses
where hostname<>'' and (@dbid is null or dbid=@dbid)
if @includeip=0 goto lb_show
--如果不显示IP地址,就直接显示
declare @sql varchar(500),@hostname nchar(128),@id int
create table #ip(hostname nchar(128),a varchar(200))
declare tb cursor local for select distinct hostname from #tb
open tb
fetch next from tb into @hostname
while @@fetch_status=0
begin
set @sql='ping '+@hostname+' -a -n 1 -l 1'
insert #ip(a) exec master..xp_cmdshell @sql
update #ip set hostname=@hostname where hostname is null
fetch next from tb into @hostname
end
update #tb set net_ip=left(a,patindex('%:%',a)-1)
from #tb a inner join (
select hostname,a=substring(a,patindex('Ping statistics for %:%',a)+20,20)
from #ip
where a like 'Ping statistics for %:%') b on a.hostname=b.hostname
drop table #ip
lb_show:
select id,数据库名=dbname,客户机名=hostname,用户名=loginname
,网卡物理地址=net_address,IP地址=net_ip,应用程序名称=prog_name
from #tb
drop table #tb
--查询结果:

------------------------------------------------------------------------------------------------------------
----一段查询SQL Server服务器阻塞和死锁信息用的脚本
declare @spid int,@bl int,
@intTransactionCountOnEntry int,
@intRowcount int,
@intCountProperties int,
@intCounter int
create table #tmp_lock_who (
id int identity(1,1),
spid smallint,
bl smallint)
insert into #tmp_lock_who(spid,bl) select 0 ,blocked
from (select * from sysprocesses where blocked>0 ) a
where not exists(select * from (select * from sysprocesses where blocked>0 ) b
where a.blocked=spid)
union select spid,blocked from sysprocesses where blocked>0
-- 找到临时表的记录数
select @intCountProperties = Count(*),@intCounter = 1
from #tmp_lock_who
if @intCountProperties=0
select N'现在没有阻塞和死锁信息' as message
-- 循环开始
while @intCounter <= @intCountProperties
begin
-- 取第一条记录
select @spid = spid,@bl = bl
from #tmp_lock_who where Id = @intCounter
begin
if @spid =0
select N'引起数据库死锁的是: '+ CAST(@bl AS VARCHAR(10)) + N'进程号,其执行的SQL语法如下'
else
select N'进程号SPID:'+ CAST(@spid AS VARCHAR(10))+ N'被' + N'进程号SPID:'+ CAST(@bl AS VARCHAR(10)) +N'阻塞,其当前进程执行的SQL语法如下'
DBCC INPUTBUFFER (@bl )
end
-- 循环指针下移
set @intCounter = @intCounter + 1
end
drop table #tmp_lock_who
附:杀死相关会话的脚本为 kill SPID 注意SPID为常量,不能为变量,要用变量,请用动态语句
2009年3月8日
#
赖床狂想记录
今天星期天,睡到了早上9点多,而且还没有想起床的迹象。感觉很过份,这么能浪费一个年轻人这么多的白天大好时光呢?所谓“一寸光阴一寸金”嘛!
听说人在躺着的时候,血液流经大脑的量是最多的(什么有人说是倒挂着。倒挂着就不用了,一、俺还没达到那境界,二、俺还不想脑充血呢,到时候弄个瘫痪什么的就不好了。),比坐着,站着多。如果配合一个好的环境,这个时候人的思考能力是最佳的。
既然已经赖床了,那就得思考一些有意义的事(鸡鸣狗盗之事就算了,我是良民,不想这些事)。联系到了自己的工作,我常常思考两个问题(平时也有想,只是被烦琐的工作及生活给干扰了,没完全静下心来想过,看来有时候也得喝一点静心口服液了,哈哈。。。):
一、 分析、设计、实现一套信息系统,在排除了团队沟通合作、系统维护与升级、性能、安全、稳定、架构与布署等等因素之后,最直接、最直奔主题的系统设计模型(模式)是什么?思来想去,我认为是这样的:
用户操作接口(比如图形操作界面)与必要的其它技术(如门禁控制器的调用接口) + SQL + 数据库(DB)
以上的思考方式让我想起了学习中学数学、物理的研究方法:排除一切干扰因素,抽象出最原始、最根本的东西来。比如:研究牛顿动力学第二定律,做实验验证时,很多时候要排除掉摩擦力、风的阻力等。
二、 为什么以上的模型(模式)要提到或者说只提到数据库与SQL?很多信息系统没有用到数据库作为存储方式或者说根本没有外部的存储方式也运行得很好、很滋润。不具有普遍性、一般性,这个模型(模式)很失败、很败笔。看来真是完蛋了,事实如此吗?请听我慢慢地说来。首先,记住,这里只是有感而发的记录,不是发表什么学术论文,没必要这么较劲吧!其次,这个模型(模式)提到的数据库与SQL只是信息系统数据存储与处理的代称而已(只是这个技术现在用得多,得被代表一下参加这里的“两会”啰,哈哈。。。)。还有,我敢说现在所有的信息系统都需要存储数据与处理数据,最夸张、最恶劣的情况下也得存储自身的程序文件吧!自身的程序文件也算数据喔。
现在说点别的事,最近没事看了一些关于宇宙及地球生命演化的科教片,受益非浅。发现宇宙及生命最根本、最抽象的描述就是“有容乃大、以量取胜、慢条斯理”。
首先,宇宙很大。太阳的光线到达地球要六分钟左右,想像一下,光线每秒30万公里都要走6分钟,人类最快的超音速飞机不知要走多久。人类到火星以现有的技术以最短距离最快也要半年,走出太阳系就不知道要多久了,好像美国上个世纪70年代初发射的一个太阳系外探测器现在还在太阳系内飞着呢。在银河系中,象太阳系这样的恒星系多如牛毛,有好几万亿个(总之,绝对比世界所有的牛毛加起来还多)。而在宇宙中,象银河系这样的星系又多如牛毛(数量绝对不会比银河系拥有的恒星系数量少),构成一个总星系。到此就结束了吧,还没呢,听说总星系外还有别的总星系,更恐怖的事,数量还没办法预测。这怎么就没完没了呢!那宇宙到底有没有边界呢!听霍金老人家说,宇宙有界无边,听着很玄乎,我们这些普通人好象没办法理解,听说要有丰富的数学知识及多维时空概念才能理解。我们现在生活的时空是长宽高的三维加半维只向前的时间轴,这个我还能理解,有生活经验吗!不过,现在的宇宙学家、物理学家、天文学家推导出宇宙有11维。这个对大部份人来说,也许到死都搞不明白。看来,宇宙是很慷慨的,给我们人类这么大的活动地盘(地球上数量巨大的房地产商和投机分子想炒房看来在广袤的宇宙是永远没有机会了,哈哈。。。。。)。这么大的地盘,即使有外星人,也不用跟外星人争吧。这里,俺又要说一些题外话了,听说传说中的《西方经济学》是研究资源的稀缺与人类无穷欲望无法满足的矛盾的学问。说了以上的话,我对这个说法深表怀疑了。宇宙这么大,这么能说资源是稀缺的呢,我们人类在宇宙中没见过、没摸过的东西多着呢。什么时候来个人类思想大飞越,技术大突破,再来个宇宙大发现(类似于当年哥伦布的地理大发现)什么的,把宇宙中无限的资源开发利用,那时候真是人类想要啥就有啥,过着神仙般的日子,按需分配,实现共产主义,从必然王国走向自由王国(暂停三分钟,意淫中,羡慕中。。。。)。所以我说,那些研究《西方经济学》的老学究有点忽悠我们,科学技术是第一生力,看来这句话说得一点都没错,我还要再补一句,科学技术是以后促进经济发展的第一要素。将来应该有一门新的经济学课程(名称暂定《宇宙经济学》吧)就是主要研究人类现在的无能及无穷的欲望与宇宙中无限资源无法开发利用的矛盾的学问。
说完又大又广的宇宙,就说说组成物质又微又小的原子、基本粒子等。听说现在人类认识的基本元素为108种(又好像是109种,我忘了)。一定数量的元素原子就可以组成一个分子,超巨数量的这些分子就组成了我们肉眼见得着的物质。比如一滴水就是由好几亿个水分子组成。无数滴水组成了我们生产生活中用到的水。从中可以看得出来,宇宙的组成规律有时候很单纯、很简单----“以量取胜”。
现在世界上已知的最长寿的动物为海龟,听说可以活一千多岁,不过它的长寿密诀就是:少动、少思考,尽量减少新陈代谢。这很像过去和尚的修行。对于我来说,这样的生活方式打死我都不想过,宁愿命短一点,也要轰轰烈烈地过一生。不过,相对于生命的进化历程来说,海龟的这一千多年不值得一提。人类去除尾巴的进化都经历了好几百万年。还有,万一我们的太阳系不小心飞到黑洞旁边,整个太阳系也要过好几百万年才能被黑洞给完全吞没,在这段期间内人类及其它活的、死的东东都是在煎熬、比活在地狱还恐怖----在地球里,由于黑洞的强大的引力影响,频繁的地震与火山爆发让地球变了形;太空中受黑洞引力影响的大陨石大量攻击地球,这时大气层已经保护不了我们了;原来给地球生机的太阳由于黑洞引力的撕扯已经变得不在和蔼可亲了,它频繁在向地球喷发(射)有害物质及射线;最后的地球再还没被黑洞吞没之前,就因为地球自身的高温及频繁的地质运动而撕裂,不辛的是,这些景象大部份都能被未来的人类看到,而且一看就是一百多万年,让人类长期忍受痛苦与恐怖。从这可以看出来,大自然有时候好象太没有执行力了,一件事做得拖拖拉拉的,不管是好事还是坏事。用“慢条斯理”来形容一点也不为过。
好了,话题展开那么多,该收回来了。我觉得现在信息技术中的数据库技术很符合宇宙与生命中的“有容乃大、以量取胜、慢条斯理”最基本描述。数据库数据存储量大、数据存储范围广、存储数据结构与类别的复杂。如果人类那一天要在计算机信息系统里构建一个虚拟的宇宙,我看使用数据库(超大规模数据存储)技术是最佳的技术方案,因为它包含了对宇宙与生命描述所具有的最基本属性。记得IBM中国DB2部门一位相关负责人说了一句话:“有大量、大规模数据的信息系统才是一个成熟、成功的系统,才是个可推广应用的系统”(大致是这么说的,这个负责人还是个女的,写这篇文章时刚好在三八女人节,这里先赞一下)。大规模的数据存储与处理技术(特别是现在的数据库技术)是对现实宇宙的模拟与复制。
2008年10月10日
#
--字符串前部去除自定义函数(T-SQL)
Create FUNCTION f_delete_head(@s varchar(8000),@flag varchar(10))
returns varchar(8000) --字符串前部去除自定义函数
as
begin
declare @i int
select @i=1
while (@i<=len(@s))
begin
if (substring(@s,@i,len(@flag) )<>@flag)
begin
break
end
select @i=@i+len(@flag)
end
return right(@s,len(@s)-@i+1)
end
------------------------------------------------------------------------------------
--执行结果示例:

2008年8月4日
#
摘要: 复习:C#3.0面向对象测试开发包----------------Form1.cs文件using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms...
阅读全文
2008年7月31日
#
2008年3月12日
#
摘要: --M1非接触式射频存储卡卡唯一号(十六进制值表示),去除其前部为0的自定义函数Create FUNCTION dbo.f_header_zero_delete(@s varchar(8)) RETURNS varchar(8)ASBEGINdeclare @i int,@ss varchar(8)select @i=(case when substring(@s,1,1)<>'0' ...
阅读全文
2008年2月15日
#
2008年1月20日
#
摘要: 从数据库系统管理的角度上回答数据库是什么 从静态的角度上看,数据库就是存储在操作系统中的数据文件与相关文件。但仅仅有这些是不能构成数据库的,它还需要处理与管理以上这些文件的程序(特注:含管理与处理文件中记录的数据及相关数据)。即使这样还是不能构成真正意义上的数据库。这里忘了说最关键的一点,这些程序是要运行起来的即要变成操作系统的进程(线程)。这样外部程序才能访问其数据,更为重要的是它可以把以上的...
阅读全文