2009年11月

在SQL SERVER数据库中获取自增长ID的三种方法的比较

SCOPE_IDENTITY

返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。

IDENT_CURRENT

返回为任何会话和任何作用域中的指定表最后生成的标识值。这个函数需要一个以表名为值的变量,也就是说虽然不受会话和作用域的限制,却会受到表的限制。

@@IDENTITY

返回最后插入的标识值。

体会:加上事务处理,两个函数一个变量没有本质区别。不加事务处理两个函数一个变量受到其他会话、作用域的影响不一样。

一直以来都是使用@@identity来获得最后一个插入到表的记录的identity值,最近发现这种方法在某种情况是不可靠的,先来看看两个概念
作用域:在SQL SERVER作用域就是一个模块-存储过程,触发器,函数或批处理
会话: 一个用户连接产生的所有上下文信息

相同点:都是返回最后插入的标识值
不同点
@@identity:返回当前会话最后一个标识值,不限于特定的作用域;
ident_current('tablename'):返回任何会话,任何作用域中的指定表中生成的最后一个标识值;
scope_identity:返回当前会话当前作用域任何表生成的最后一个标识值 。

例如,有两个表 T1 和 T2,在 T1 上定义了一个 INSERT 触发器。当将某行插入 T1 时,触发器被激发,并在 T2 中插入一行。此例说明了两个作用域:一个是在 T1 上的插入,另一个是作为触发器的结果在 T2 上的插入。
假设 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后返回不同的值。
@@IDENTITY 返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值,该值是插入 T2 中的值。
SCOPE_IDENTITY() 返回插入 T1 中的 IDENTITY 值,该值是发生在相同作用域中的最后一个 INSERT。如果在作用域中发生插入语句到标识列之前唤醒调用 SCOPE_IDENTITY() 函数,则该函数将返回 NULL 值。
而IDENT_CURRENT('T1') 和 IDENT_CURRENT('T2') 返回的值分别是这两个表最后自增的值。

不小心申请开通了google wave,可以发邀请

好像是wave刚开始申请测试的时候,我填写了一个申请单子,就在前几天google发邮件告诉我可以进入wave测试了。进去看了下,不知道怎么玩,本来google账户上的联系人就很少,感觉也没什么意思,不知道怎么加东西玩,还待研究。看到网上那么多人求google wave邀请,如果有人不小心进到我的博客,看到此文章,想要wave邀请的可以给我留言,我可以给你一个!

javascript取窗口的可视高度和页面的内容高度

用javascript在不同的浏览器中取窗口的可视高度和页面的内容高度是个烦心的事,所用的html标准不同、页面的内容高度是否超过窗口的可视高度都会对取值产生影响,所用到的取值方法也不同。

一、取窗口的可视高度(即浏览器的上面的工具栏到下面的状态栏之间的高度)

1、IE中的取法

[code lang="js"]document.getElementsByTagName("html")[0].offsetHeight;[/code]

2、Firefox、Chrome、Opera中取法

[code lang="js"]window.innerHeight;[/code]

二、取页面内容的高度(所有浏览器中的取法)

[code lang="js"]Math.max(document.getElementsByTagName("body")[0].scrollHeight, 窗口的可视高度)[/code]

三、完整的代码如下:

[code lang="js"]
//窗口的可视高度
var windowHeight=document.all ? document.getElementsByTagName("html")[0].offsetHeight : window.innerHeight;
//页面的内容高度
var pageHeight=Math.max(windowHeight, document.getElementsByTagName("body")[0].scrollHeight);
[/code]

正则表达式之获取匹配、非获取匹配、正向预查、负向预查

看一下下面这个表格,就应该很清楚了,绿色代表匹配结果。

说明 正则表达式 匹配结果 $1
普通表达式 windows 98|2000|2003 windows 98 windows 2000windows 2003
后向引用,获取匹配 windows (98|2000|2003) windows 98windows 2000windows 2003 98,2000,2003
非获取匹配 windows (?:98|2000|2003) windows 98windows 2000windows 2003 获取不到$1
正向预查,非获取匹配 windows (?=98|2000) windows 98 windows 2000 windows 2003
负向预查,非获取匹配 windows (?!98|2000) windows 98 windows 2000 windows 2003