DATABASE

在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′) 返回的值分别是这两个表最后自增的值。

从数据库中随机取出N条记录的方法,Sql Server和Access中

Sql Server中如下取,很简单,newid()即可
select top N * from TABLE order by newid()

Access中用如下语句虽说可以取到随机的记录,但每次取的都相同,故如下语句用处不大:
select top N * from TABLE order by RND(id)
id一个数字列,最好是主键,其它列也可,如:RND(len(username))

但可以用如下的order by使每次取的记录都不相同:
select top N * from TABLE order by RND(-(随机数-id))
RND()里面必须是负值,随机数可以自己用程序生成,如:
select top 10 * from js_FaceCat a order by Rnd(-("+new System.Random().Next(666666)+"+a.catID))

花了一上午找资料看access如何简单的取随机记录,但没有搞明白为什么要如此,凑合用了。

Sql Server出现“内部错误。文本管理器无法继续执行当前语句”的错误

今天查看服务器事件日志,发现Sql Server出现好多如下错误:
错误: 7102,严重度: 20,状态: 0
SQL Server Internal Error. Text manager cannot continue with current statement.

中文:
错误: 7102,严重度: 20,状态: 0
SQL Server 内部错误。文本管理器无法继续执行当前语句。

这应该是访问网站是出现的错误,但我也无法找到是何原因,百度搜索了一下,发现有文章说是因为没有打sp4补丁的应该,看了一下服务器居然还是sp2的,汗一个,sp4补丁早就放在服务器上了,但一直都没有装上,赶紧装上试试,不知道还会不会出现上面的错误!

ps:今天看了一下,没有这个错误了,为什么以前就没有出现这个错误呢,也是没有打补丁的,想不通!