请教一下,
1、什么情况下使用checksum?2、checksum(para1)和checksum(para2)有可能得到相同的值吗(para1和para2是不同的值)

解决方案 »

  1.   


    返回按照表的某一行或一组表达式计算出来的校验和值。CHECKSUM 用于生成哈希索引。 Transact-SQL 语法约定语法
     
    CHECKSUM ( * | expression [ ,...n ] )
     参数

    指定对表的所有列进行计算。如果有任一列是非可比数据类型,则 CHECKSUM 返回错误。
    非可比数据类型有 text、ntext、image、XML 和 cursor,还包括以上述任一类型作为
    基类型的 sql_variant。expression 
    除非可比数据类型之外的任何类型的表达式。返回类型
    int 备注
    CHECKSUM 对其参数列表计算一个称为校验和的哈希值。此哈希值用于生成哈希索引。
    如果 CHECKSUM 的参数为列,并且对计算的 CHECKSUM 值生成索引,则结果是一个哈
    希索引。它可用于对列进行等价搜索。CHECKSUM 满足哈希函数的下列属性:在使用等于 (=) 运算符比较时,如果两个列表
    的相应元素具有相同类型且相等,则在任何两个表达式列表上应用的 CHECKSUM 将返
    回同一值。对于该定义,指定类型的 Null 值被作为相等进行比较。如果表达式列表
    中的某个值发生更改,则列表的校验和通常也会更改。但只在极少数情况下,校验和
    会保持不变。因此,我们不推荐使用 CHECKSUM 来检测值是否更改,除非应用程序可
    以容忍偶尔丢失更改。请考虑改用 HashBytes。指定 MD5 哈希算法时,HashBytes 
    为两个不同输入返回相同结果的可能性比 CHECKSUM 小得多。表达式的顺序影响 CHECKSUM 的结果值。用于 CHECKSUM(*) 的列顺序是表或视图定义
    中指定的列顺序。其中包括计算列。
    示例
    以下示例演示如何使用 CHECKSUM 生成哈希索引。通过将计算校验和列添加到索引的表中
    ,然后对校验和列生成索引来生成哈希索引。 复制代码 
    -- Create a checksum index.
    SET ARITHABORT ON;
    USE AdventureWorks; 
    GO
    ALTER TABLE Production.Product
    ADD cs_Pname AS CHECKSUM(Name);
    GO
    CREATE INDEX Pname_index ON Production.Product (cs_Pname);
    GO
     校验和索引可用作哈希索引,尤其是当要索引的列为较长的字符列时可以提
    高索引速度。校验和索引可用于等价搜索。 
    /*Use the index in a SELECT query. Add a second search 
    condition to catch stray cases where checksums match, 
    but the values are not the same.*/
    SELECT * 
    FROM Production.Product
    WHERE CHECKSUM(N'Bearing Ball') = cs_Pname
    AND Name = N'Bearing Ball';
    GO
     对计算列创建索引将具体化为校验和列,对 ProductName 值所做的任何更改都将传播到校验和列。
    也可以直接对索引的列生成索引。然而,如果键值较长,则很可能不执行校验和索引甚至常规索引。
      

  2.   


    msdn我也会查的,我看了msdn才发了这两个问题
      

  3.   


    checksum的典型性用法可以替代文本检索。比如为文本字段添加一个对应的checksum计算列,然后筛选时,使用
    where 计算列=checksum('文本') 方式进行检索。可以提高检索文本的效率。至于俩个不同的值完全有可能会生成相同的值。毕竟checksum是校验和值 
      

  4.   

    checksum有个bug ,字段里有- 的最好别用。select checksum('ab')
    select checksum('a-b')
    -- have the same result 151912974