wuguang1023 2011-01-05 16:22
浏览 269
已采纳

.net 多站点数据库方式session共享疑问

本人是菜鸟需要做多站点共享 我在g.cn里面找了好多关于多站点共享的 其中有个关于存储seesion存储过程小弟很是疑问
alter PROCEDURE [dbo].[AspSessionprco]
@appName char(280),
@appId int OUTPUT
AS
SET @appName = LOWER(@appName)
SET @appId = NULL

 SELECT @appId = AppId 
FROM ASPStateTempApplications 
WHERE AppName = @appName 

IF @appId IS NULL BEGIN 
    BEGIN TRAN        

    SELECT @appId = AppId 
    FROM dbo.ASPStateTempApplications WITH (TABLOCKX) 
    WHERE AppName = @appName 

    IF @appId IS NULL 
    BEGIN 
        EXEC GetHashCode @appName, @appId OUTPUT 

        INSERT dbo.ASPStateTempApplications([appId],[appName]) 
        VALUES 
        (@appId, @appName) 

        IF @@ERROR = 2627 
        BEGIN 
            DECLARE @dupApp char(280) 

            SELECT @dupApp = RTRIM(AppName) 
            FROM  dbo.ASPStateTempApplications 
            WHERE AppId = @appId 

            RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and ''%s''. Please rename the 1st application to resolve the problem.', 
                        18, 1, @appName, @dupApp) 
        END 
    END 

    COMMIT 
END 

RETURN 0 

有2个问题
EXEC GetHashCode @appName, @appId OUTPUT
这个里面的 GetHashCode 存储过程是系统自带的吗?如果是为什么我的sqlserver2005里面美玉哦,如果不是请大虾告诉我这个该怎么写,小弟万分感谢!!!。

  • 写回答

1条回答 默认 最新

  • lang_shao 2011-01-05 16:34
    关注

    [code="sql"]CREATE PROCEDURE GetHashCode
    @input tAppName,
    @hash INT OUTPUT
    AS
    /*
    This sproc is based on this C# hash function:

    int GetHashCode(string s)
    {
    int hash = 5381;
    int len = s.Length;

    for (int i = 0; i < len; i++) {
    int c = Convert.ToInt32(s[i]);
    hash = ((hash << 5) + hash) ^ c;
    }

    return hash;
    }

    However, SQL 7 doesn't provide a 32-bit integer
    type that allows rollover of bits, we have to
    divide our 32bit integer into the upper and lower
    16 bits to do our calculation.
    */

    DECLARE @hi_16bit INT
    DECLARE @lo_16bit INT
    DECLARE @hi_t INT
    DECLARE @lo_t INT
    DECLARE @len INT
    DECLARE @i INT
    DECLARE @c INT
    DECLARE @carry INT

    SET @hi_16bit = 0
    SET @lo_16bit = 5381

    SET @len = DATALENGTH(@input)
    SET @i = 1

    WHILE (@i <= @len)
    BEGIN
    SET @c = ASCII(SUBSTRING(@input, @i, 1))

    /* Formula:
    hash = ((hash << 5) + hash) ^ c */

    /* hash << 5 /
    SET @hi_t = @hi_16bit * 32 /
    high 16bits << 5 /
    SET @hi_t = @hi_t & 0xFFFF /
    zero out overflow */

    SET @lo_t = @lo_16bit * 32 /* low 16bits << 5 */

    SET @carry = @lo_16bit & 0x1F0000 /* move low 16bits carryover to hi 16bits /
    SET @carry = @carry / 0x10000 /
    >> 16 /
    SET @hi_t = @hi_t + @carry
    SET @hi_t = @hi_t & 0xFFFF /
    zero out overflow */

    /* + hash /
    SET @lo_16bit = @lo_16bit + @lo_t
    SET @hi_16bit = @hi_16bit + @hi_t + (@lo_16bit / 0x10000)
    /
    delay clearing the overflow */

    /* ^c */
    SET @lo_16bit = @lo_16bit ^ @c

    /* Now clear the overflow bits */

    SET @hi_16bit = @hi_16bit & 0xFFFF
    SET @lo_16bit = @lo_16bit & 0xFFFF

    SET @i = @i + 1
    END

    /* Do a sign extension of the hi-16bit if needed */
    IF (@hi_16bit & 0x8000 <> 0)
    SET @hi_16bit = 0xFFFF0000 | @hi_16bit

    /* Merge hi and lo 16bit back together /
    SET @hi_16bit = @hi_16bit * 0x10000 /
    << 16 */
    SET @hash = @hi_16bit | @lo_16bit

    RETURN 0
    GO [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 计算二重积分∫∫e^(x+y)dxdy,其中0≤x≤1,0≤y≤1,试分别用复合辛普森公式(取n=4)以及高斯求积公式(取n=4)计算积分 给出matlab程序
  • ¥15 opencv 无法读取视频
  • ¥15 用matlab 实现通信仿真
  • ¥15 按键修改电子时钟,C51单片机
  • ¥60 Java中实现如何实现张量类,并用于图像处理(不运用其他科学计算库和图像处理库))
  • ¥20 5037端口被adb自己占了
  • ¥15 python:excel数据写入多个对应word文档
  • ¥60 全一数分解素因子和素数循环节位数
  • ¥15 ffmpeg如何安装到虚拟环境
  • ¥188 寻找能做王者评分提取的