SQL SERVER 2000 求函數

bb_chen 2010-02-01 05:20:54
使用分頁查詢,我在條件中用了not in。當主鍵為2個字段時,我用checksum。
但是發現使用checksum(a,b)時,即使a,b的值不一樣,但是使用checksun(a,b)的結果還是會相同。像下面就會相同:
select Checksum('5402','20091216005')
select Checksum('5401','20091216035')
結果都是-1574694618


現求一函數XX取代checksum,使得XX(a,b)在a,b不同的情況下結果一定不同。

謝謝
...全文
141 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bb_chen 2010-02-02
  • 打赏
  • 举报
回复
下面是我的C#語句:

            string tmpStr = @"(Select Distinct A.* FROM MOCTC AS A LEFT JOIN MOCTD AS B ON A.TC001=B.TD001 AND A.TC002=B.TD002 Where '+ @Keywords+' )";
string str = @"(SELECT TOP " + pagesize.ToString() + " * FROM " + tmpStr + " as A WHERE CHECKSUM(TC001,TC002) NOT IN (SELECT TOP " + Convert.ToString(pagesize * (pageindex - 1)) + " CHECKSUM(TC001,TC002) FROM " + tmpStr + " AS A ORDER BY TC001,TC002) ORDER BY TC001,TC002) ";
string sql = "Select A.* ,B.MQ002 AS TC0012,C.MB002 AS TC0042,D.MD002 AS TC0052,E.MA002 AS TC0062,F.MA002 AS TC0152,G.ME002 AS TC0212 From " + str + " as A LEFT JOIN CMSMQ as B ON A.TC001=B.MQ001 LEFT JOIN CMSMB as C ON A.TC004=C.MB001 LEFT JOIN CMSMD as D ON A.TC005=D.MD001 LEFT JOIN PURMA as E ON A.TC006=E.MA001 LEFT JOIN DSCSYS.dbo.DSCMA AS F ON A.TC015=F.MA001 LEFT JOIN CMSME AS G ON A.TC021=G.ME001";


傳入的參數為:int pagesize, int pageindex, string keywords,
keywords為查詢條件

謝謝!
bb_chen 2010-02-02
  • 打赏
  • 举报
回复
我執行下面的語句
Select  A.* FROM MOCTC AS A LEFT JOIN MOCTD AS B ON A.TC001=B.TD001 AND A.TC002=B.TD002 Where   (A.TC008='54' OR A.TC008='55') 

Select distinct CHECKSUM(TC001,TC002) as a FROM MOCTC AS A LEFT JOIN MOCTD AS B ON A.TC001=B.TD001 AND A.TC002=B.TD002 Where (A.TC008='54' OR A.TC008='55')

Select distinct Binary_CHECKSUM(TC001,TC002) as a FROM MOCTC AS A LEFT JOIN MOCTD AS B ON A.TC001=B.TD001 AND A.TC002=B.TD002 Where (A.TC008='54' OR A.TC008='55')

得到記錄數的結果是

(1517 row(s) affected)


(1330 row(s) affected)


(1330 row(s) affected)

大家幫忙看看,謝謝

dobear_0922 2010-02-01
  • 打赏
  • 举报
回复
BINARY_CHECKSUM


Transact-SQL 参考
BINARY_CHECKSUM
返回对表中的行或表达式列表计算的二进制校验值。BINARY_CHECKSUM 可用于检测表中行的更改。

语法
BINARY_CHECKSUM ( * | expression [ ,...n ] )

参数
*

指定对表中的所有列进行计算。BINARY_CHECKSUM 在计算中忽略具有不可比数据类型的列。不可比数据类型是 text、ntext、image、cursor 以及基本类型为前 4 个数据类型之一的 sql_variant。

expression

任何类型的表达式。BINARY_CHECKSUM 在计算中忽略具有不可比数据类型的表达式。

注释
在表中任一行上计算的 BINARY_CHECKSUM(*) 返回相同的值,只要随后没有修改行。BINARY_CHECKSUM(*) 将为大多数(但不是全部)行更改返回不同的值,并可用于检测大多数行修改。

BINARY_CHECKSUM 可应用在表达式列表上,并为给定的列表返回相同的值。如果任意两个表达式列表的对应元素具有相同的类型和字节表示法,则在这两个列表上应用的 BINARY_CHECKSUM 将返回相同的值。对于此定义,特定类型的 NULL 值被认为具有相同的字节表示法。

BINARY_CHECKSUM 和 CHECKSUM 具有相似的功能:它们可用于计算表达式列表上的校验值,且表达式的顺序将影响结果值。BINARY_CHECKSUM(*) 使用的列顺序是表或视图定义中指定的列顺序,包括计算列。

CHECKSUM 和 BINARY_CHECKSUM 仅为字符串数据类型返回不同的值,这类字符串的区域设置可能导致具有不同表示法的字符串进行等值比较。字符串数据类型为 char、varchar、nchar、nvarchar 或 sql_variant(如果 sql_variant 的基本类型是字符串数据类型)。例如,字符串"McCavity"和"Mccavity"的 BINARY_CHECKSUM 值不同。反之,在不区分大小写的服务器中,上述字符串的 CHECKSUM 返回相同的校验值。CHECKSUM 值不应与 BINARY_CHECKSUM 值进行比较。
bb_chen 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 happyflystone 的回复:]
如果是串的话,试试直接a+b
[/Quote]

有些是數字的,不知道有沒有影響,我試下看看

bb_chen 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fredrickhu 的回复:]
SQL codeselect Checksum('5402','20091216005')select Checksum('5401','20091216035')/*
-----------
-502171623

(1 行受影响)


-----------
-2112784375

(1 行受影响)*/
[/Quote]

我的運行結果確實都是-1574694618,

唉,怎麼你們的會得到不一樣的結果呢
feixianxxx 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 happyflystone 的回复:]
如果是串的话,试试直接a+b
[/Quote]
...
--小F-- 2010-02-01
  • 打赏
  • 举报
回复
字符串的话 可以直接相加
--小F-- 2010-02-01
  • 打赏
  • 举报
回复
select Checksum('5402','20091216005') 
select Checksum('5401','20091216035')
/*
-----------
-502171623

(1 行受影响)


-----------
-2112784375

(1 行受影响)
*/
-狙击手- 2010-02-01
  • 打赏
  • 举报
回复
如果是串的话,试试直接a+b
SQL77 2010-02-01
  • 打赏
  • 举报
回复
select Checksum('5402','20091216005') 
select Checksum('5401','20091216035')

-----------
-502171623

(所影响的行数为 1 行)


-----------
-2112784375

(所影响的行数为 1 行)

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧