SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY

SQL Server 2000中,有三个比较类似的功能:他们分别是:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它们都返回插入到 IDENTITY 列中的值。

1) IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。它不受作用域和会话的限制,而受限于指定的表。
2) @@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
3) SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值

SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@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′) 返回的值分别是这两个表最后自增的值。

mssql分页存储过程.2

基于游标的分页对很多情况不能适用,这是一个利用临时表构建的分页存储过程

CREATE PROC [dbo].[pre_P_ListRecordOrderByID]
    @page INT,
    @pageSize INT
AS
    SET NOCOUNT ON 

    DECLARE @beginId INT, @endId INT, @pageCount INT

    CREATE TABLE #tmp_PagedRecordOrderByID
    (
        XID INT IDENTITY ,
        ID INT NOT NULL ,
        WinTimes INT NOT NULL DEFAULT 0,
        DefeatTimes INT NOT NULL DEFAULT 0,
        Area VARCHAR(100) NULL ,
        Server VARCHAR(100) NULL
    )

    INSERT INTO #tmp_PagedRecordOrderByID (ID,[Group],WinTimes,DefeatTimes,Area,Server)
    SELECT ID,[Group],WinTimes,DefeatTimes,Area,Server
    FROM pre_Statistic
    ORDER BY ID DESC

    SELECT @pageCount = COUNT(ID) FROM gch_Statistic
    SELECT @pageCount = CEILING(@pageCount/@pageSize) + 1
    SELECT @beginId = (@page-1) * @pageSize + 1
    SELECT @endId = @beginId + @pageSize -1

    SELECT ID,[Group],WinTimes,DefeatTimes,Area,Server
    FROM #tmp_PagedRecordOrderByID
    WHERE XID BETWEEN @beginId AND @endId

    DROP TABLE #tmp_PagedRecordOrderByID
    SET NOCOUNT OFF

    RETURN @pageCount

GO

不知道有没有比较通用的分页存储过程呢?

mssql分页存储过程

--列出所有新闻(分页参数 当前页数/每页记录数 返回记录总数)

CREATE PROC [dbo].[ProcListNews]
	@page INT,
	@pageSize INT
AS
	DECLARE @beginId INT, @endId INT, @pageBegin INT, @pageEnd INT, @xtmp INT, @count INT

	SELECT @count=(SELECT COUNT(*) countx FROM News )

	--声明游标
	DECLARE fastRead CURSOR SCROLL FOR SELECT ID FROM News ORDER BY PostTime desc

	OPEN fastRead

	SELECT @beginId=(@page-1)*@pageSize+1
	SELECT @endId = @beginId+@pageSize-1

	FETCH ABSOLUTE @beginId FROM fastRead INTO @pageBegin

	IF @endId > @count
		FETCH LAST FROM fastRead INTO @pageEnd
	ELSE
		FETCH ABSOLUTE @endId FROM fastRead into @pageEnd

	--切换大小 between语句中排在前位的必须是较小数字
	IF @pageBegin>@pageEnd
		BEGIN
			SELECT @xtmp=@pageBegin
			SELECT @pageBegin=@pageEnd
			SELECT @pageEnd=@xtmp
		END

	SELECT News.ID,Title,Content,Url,[Name] CategoryName,PostTime 
	FROM News JOIN NewsCategory c ON CategoryID=c.ID 
	WHERE News.ID BETWEEN @pageBegin AND @pageEnd ORDER BY PostTime DESC

	CLOSE fastRead
	DEALLOCATE fastRead
	RETURN @count
GO

asp代码是这样的

'获取新闻记录
set cmd = Server.CreateObject("ADODB.Command")

with cmd
	.ActiveConnection = ConnString
	.CommandType = adCmdStoredProc
	.CommandText ="ProcListNews"	
	.Parameters.Append .CreateParameter ("RETURN_VALUE",adInteger,AdParamReturnValue)
	.Parameters.Append .CreateParameter("@page",adInteger,,,page)
	.Parameters.Append .CreateParameter("@pageSize",adInteger,,,pagesize)
	set rsNews = .Execute
	allcount = .Parameters("RETURN_VALUE")
end with

其他的都正常,只是不知道为什么,allcount总是获取不到返回值……