newid()都产生什么格式规律的字符?checksum函数又是怎么对newid()进行处理的?请用实际实验数据解释,谢谢。
declare @tb table(id int, bn bigint)insert @tb(id) select 1
union all select 2
union all select 3select * from @tbdeclare @n bigint, @i bigint
set @n=1000000update @tb 
set @i=checksum(newid())%@n, bn=abs((@n+1)*@i)select * from @tb/*
id          bn
----------- --------------------
1           NULL
2           NULL
3           NULL(3 行受影响)(3 行受影响)id          bn
----------- --------------------
1           334277334277
2           438166438166
3           509238509238
*/

解决方案 »

  1.   

    declare @id varchar(12)
    set @id=left(replace(newid(),'-',''),12) 
    declare @t table(ID varchar(12))
    insert @t select @id where @id not in(select id from @t)
    select * from @t
    /*
    ID           
    ------------ 
    B5952C00FCD6(影響 1 個資料列)*/
    这种好理解些。
      

  2.   

    我知道newid()产生结果是字符加上"-"的格式。但是checksum是怎么处理的我不清楚。还有newid()是不是产生固定长度的字符格式?
      

  3.   


    NEWID()产生的是一个 uniqueidentifier 类型的一值。CHECKSUM相当於一个哈希函数,跟据函数内的值产生一个哈希码。
      

  4.   


    你是说找出生成的规律吗?NEWID()就算了吧,本身就是随机生成的全球唯一识别码CHECKSUM()的算法,要找找资料,我是不知道具体内的算法是怎样的。
      

  5.   

    返回在表的行上或在表达式列表上计算的校验值。CHECKSUM 用于生成哈希索引。 
    语法 
    CHECKSUM ( * | expression [ ,...n ] ) 
    参数 

    指定在表的所有列上进行计算。如果有任一列是非可比数据类型,则 CHECKSUM 返回错误。不可比数据类型是 text、ntext、image、cursor 以及基本类型为前 4 个数据类型之一的 sql_variant。 
    expression 
    是除非可比数据类型之外的任何类型的表达式。 
    返回类型 
    int 
    注释 
    CHECKSUM 在其参数列表上计算一个称为校验值的哈希值。此哈希值用于生成哈希索引。如果 CHECKSUM 的参数是列,且在计算的 CHECKSUM 值上生成索引,则其结果是可用于在列上等价搜索的哈希索引。 
    CHECKSUM 满足哈希函数的下列属性:在使用等于 (=) 运算符比较时,如果两个列表的相应元素具有相同类型且"相等",则在任何两个表达式列表上应用的 CHECKSUM 将返回同一值。这种定义的目的在于:给定类型的 NULL 值被作为"相等"进行比较。如果表达式列表中的某个值发生变化,那么列表的校验值通常也会变化。但只在极少数情况下,校验值会保持不变。 
    BINARY_CHECKSUM 和 CHECKSUM 具有相似的功能:它们可用于计算表达式列表上的校验值,且表达式的顺序将影响结果值。在 CHECKSUM(*) 中使用的列顺序是在表或视图定义中指定的列顺序,包括计算列。 
    CHECKSUM 和 BINARY_CHECKSUM 仅为字符串数据类型返回不同的值,这类字符串的区域设置可能导致具有不同表示法的字符串进行等值比较。字符串数据类型是 char、varchar、nchar、nvarchar 或 sql_variant(如果其基本类型是字符串数据类型)。例如,字符串"McCavity"和"Mccavity"的 BINARY_CHECKSUM 值不同。反之,在不区分大小写的服务器中,上述字符串的 CHECKSUM 返回相同的校验值。CHECKSUM 值不应与 BINARY_CHECKSUM 值进行比较。 
    示例 
    使用 CHECKSUM 生成哈希索引 
    CHECKSUM 函数可以用于生成哈希索引。通过将计算校验值列添加到索引的表中,然后在校验值列上生成索引来生成哈希索引。 
    -- Create a checksum index. 
    SET ARITHABORT ON 
    USE Northwind 
    GO 
    ALTER TABLE Products 
    ADD cs_Pname AS checksum(ProductName) 
    CREATE INDEX Pname_index ON Products (cs_Pname) 
    校验值索引可用作哈希索引,尤其是当要索引的列为较长的字符列时可以提高索引速度。校验值索引可用于等价搜索。 
    /*Use the index in a SELECT query. Add a second search 
    condition to catch stray cases where checksums match, 
    but the values are not identical.*/ 
    SELECT * 
    FROM Products 
    WHERE checksum(N'Vegie-spread') = cs_Pname 
    AND ProductName = N'Vegie-spread' 
    在计算列上创建的索引将具体化为校验值列,对 ProductName 值所做的任何更改将传播到校验值列。索引也可以直接建立在索引的列上。然而,如果键值较长,则很可能不执行校验值索引甚至常规索引。 
      

  6.   

    NEWID() --> GUID
    http://topic.csdn.net/t/20050504/13/3983005.htmlCHECKSUM
    联机丛书上说的是使用的哈希值来比较的~
    http://msdn.microsoft.com/zh-cn/library/ms189788.aspx
      

  7.   

    newid() 产生的是一个32位的GUID码:E436B2A9-08E8-430B-B09C-7D23A5106E68
    checksum()产生一个哈希值,根据输入的字符串产生一个整形值,算法没人知道。
    比如:chaeck('aa')=34472462 这个不是随机的而是固定的。checksum(newid())就是将一个32位的GUID码通过哈希函数转换成一个整形数。
      

  8.   

    CHECKSUM 的联机帮助是比较难懂。。呵呵