本人是菜鸟需要做多站点共享 我在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里面美玉哦,如果不是请大虾告诉我这个该怎么写,小弟万分感谢!!!。
[quote]对于 GetHashCode 存储过程
EXEC GetHashCode @appName, @appId OUTPUT
这个块只是外部调用 ,他的appName类型和 [dbo].[AspSessionprco] 存储过程中的 @appName char(280),
类型 没有影响吧[/quote]
没有影响,只要GetHashCode中的长度比AspSessionprco的长就不会有问题了。
[code="sql"]CREATE PROCEDURE GetHashCode
@input char(280),
@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]
刚才没执行过,不好意思。现在执行过了,这个可以的。
[quote]我想知道为什么 @appName tAppName,
@appId int OUTPUT
的方式不能创建。我在网上看到的都是这样写的代码。 能帮我分析下吗。谢谢[/quote]
因为网上的,在执行这个之前,先执行了:
[code="sql"]
EXECUTE sp_addtype tAppName, 'VARCHAR(280)', 'NOT NULL'
GO
[/code]