本帖最后由 yangsnow_rain_wind 于 2013-11-12 13:51:22 编辑

解决方案 »

  1.   


    其实这个字段存的是一个文件路径,类似如下
    \\FT\SCS\SKY\W6M1\Localization\6419.0107\int\5001\prs-AF\IE90\Photos_QuotaFull-ManageStorage.jpg
    \\FT\EP\CMX\W5M4\Localizability\17.0.1541.0607\bvt\5005\en-us\IE90\SM_SLCMainViewNoData.jpg
    \\FT\DRX\SkyDriveClient\W6M1\Localization\2013.05.03\INT\3037.0503\mi-nz\Selective_Sync_Error_From_FRE_Unprovisioned.cap
    \\FT\WC\Hotmail\W6M2\Localization\17.2.6710.1000\INT\ti-ET\WC_Hotmail_MaxRecipientsScreenCapture.cap
    \\FT\EP\CMX\W5M4\Localizability\17.0.1546.0612\bvt\5005\kok-IN\IE90\SM_SLCMainView_W6_M2_IR02_NewStrings.jpg
    \\FT\SCS\SKY\W6M2\Localization\6711.1002\int\5001\chr-Cher-US\IE100\FileCloud_RearrangeModeMultiSelect.cap
    \\FT\EP\CMX\W5M4\Localizability\17.0.1533.0603\bvt\5005\ta-IN\IE90\SM_SLCMainViewNoData.jpg
    \\FT\SCS\SKY\W6M2\Localization\6711.1008\int\5001\bn-BD\IE100\DeviceCloud_QuotaFull-SetView.cap
    \\FT\SCS\SKY\W6M2\Localization\6611.1008\int\5001\fil-PH\IE100\FileCloud_PanoramaFolderThumbnail.cap
    \\FT\DRX\SkyDriveClient\W6M1\Localization\2013.08.16\INT\3145.0816\ml-in\DRX_SkyDrive_TaskDialog_ProcessRunningInElevatedMode.cap当需要再往此表中添加数据时要判断是否此图片已经存在。
    数据库设计可能有些问题,但我现在没办法修改。看有没有好的解决方案。
      

  2.   

    问了一些高手,他们的方案是通过search_key来实现,比如给一段文字一个标识,然后判断标识,而不是判断数据的内容,比如说我们下载文件时,会有个md5码,就是用来校验,你下的东西对不对,不会把文件比打开比对的。说白了,你需要改设计了。
      

  3.   


    您的意思是我在这个表中加一个新列,如:UniqueContent, 里面存储的是对这个path列的MD5计算值,然后在计算后者比较时使用该列代替原理的path列,这是个好办法,我以前想过这样,但这样最大的一个弊端是我需要修改几乎所有的程序,所以当时就抛弃这个方案了,敢问大牛还有什么别的可行方案吗?
    感谢,感谢
      

  4.   


    您的意思是我在这个表中加一个新列,如:UniqueContent, 里面存储的是对这个path列的MD5计算值,然后在计算后者比较时使用该列代替原理的path列,这是个好办法,我以前想过这样,但这样最大的一个弊端是我需要修改几乎所有的程序,所以当时就抛弃这个方案了,敢问大牛还有什么别的可行方案吗?
    感谢,感谢写错字了,然后再以后对此表进行计算或者match时使用UniqueContent列代替path列
      

  5.   


    其实这个字段存的是一个文件路径,类似如下
    \\FT\SCS\SKY\W6M1\Localization\6419.0107\int\5001\prs-AF\IE90\Photos_QuotaFull-ManageStorage.jpg
    \\FT\EP\CMX\W5M4\Localizability\17.0.1541.0607\bvt\5005\en-us\IE90\SM_SLCMainViewNoData.jpg
    \\FT\DRX\SkyDriveClient\W6M1\Localization\2013.05.03\INT\3037.0503\mi-nz\Selective_Sync_Error_From_FRE_Unprovisioned.cap
    \\FT\WC\Hotmail\W6M2\Localization\17.2.6710.1000\INT\ti-ET\WC_Hotmail_MaxRecipientsScreenCapture.cap
    \\FT\EP\CMX\W5M4\Localizability\17.0.1546.0612\bvt\5005\kok-IN\IE90\SM_SLCMainView_W6_M2_IR02_NewStrings.jpg
    \\FT\SCS\SKY\W6M2\Localization\6711.1002\int\5001\chr-Cher-US\IE100\FileCloud_RearrangeModeMultiSelect.cap
    \\FT\EP\CMX\W5M4\Localizability\17.0.1533.0603\bvt\5005\ta-IN\IE90\SM_SLCMainViewNoData.jpg
    \\FT\SCS\SKY\W6M2\Localization\6711.1008\int\5001\bn-BD\IE100\DeviceCloud_QuotaFull-SetView.cap
    \\FT\SCS\SKY\W6M2\Localization\6611.1008\int\5001\fil-PH\IE100\FileCloud_PanoramaFolderThumbnail.cap
    \\FT\DRX\SkyDriveClient\W6M1\Localization\2013.08.16\INT\3145.0816\ml-in\DRX_SkyDrive_TaskDialog_ProcessRunningInElevatedMode.cap当需要再往此表中添加数据时要判断是否此图片已经存在。
    数据库设计可能有些问题,但我现在没办法修改。看有没有好的解决方案。能不能修改一下,改为比如,nvarchar(1000),因为如果是存储文件路径,应该不需要占用那么多的字节的把
      

  6.   

    为什么不针对StormBody
    设计个int的键值的
    其实你已经有了StormID
    只是两个表都设置成了自增 可以考虑将子表的StormID改成非自增 与主表保持一致
    用StormID作关联
      

  7.   

    上面我建的两个表只是个例子,实际我们这个系统比较复杂,要操作的表没有主键,每一个instance都有好多不同版本的图,也就是有好多path,所以需要用path做关联。
    这种数据库设计肯定不太理想,不过要改变表结构可能影响太大,所以现在的看有没有补救措施,当然加上类似MD5列做标示也是种可行方法。问题看有没有更好的方法,所以来征求各位大牛的意见。
    thanks very much.
      

  8.   

    上面我建的两个表只是个例子,实际我们这个系统比较复杂,要操作的表没有主键,每一个instance都有好多不同版本的图,也就是有好多path,所以需要用path做关联。
    这种数据库设计肯定不太理想,不过要改变表结构可能影响太大,所以现在的看有没有补救措施,当然加上类似MD5列做标示也是种可行方法。问题看有没有更好的方法,所以来征求各位大牛的意见。
    thanks very much.通过checksum函数,得出一个值:
    IF OBJECT_ID (N'StormyWeather', N'U') IS NOT NULL
    DROP TABLE StormyWeather
    GOCREATE TABLE StormyWeather (
      StormID INT NOT NULL IDENTITY,
      StormHead NVARCHAR(50) NOT NULL,
      StormBody NVARCHAR(MAX) NOT NULL,  
    )
    GOINSERT INTO StormyWeather (StormHead, StormBody)
    VALUES('Stormy Weather Delays Travel',
      'The stormy weather made travel by motor vehicle difficult.')
    INSERT INTO StormyWeather (StormHead, StormBody)
    VALUES('Stormier Weather on Monday',
      'The stormier weather on Monday made vehicle travel difficult.')
    INSERT INTO StormyWeather (StormHead, StormBody)
    VALUES('Stormiest Weather in December',
      'December can be the stormiest month, making automobile travel difficult.')
    INSERT INTO StormyWeather (StormHead, StormBody)
    VALUES('Storm Grows Strong',
      'The storm is growing strong.')
    INSERT INTO StormyWeather (StormHead, StormBody)
    VALUES('Storms Crossing the Pacific',
      'The storms are lining up across the Pacific Ocean.')
    INSERT INTO StormyWeather (StormHead, StormBody)
    VALUES('Storm''s Wind Delays Travel',
      'The storm''s wind made car travel difficult on Tuesday.')
    INSERT INTO StormyWeather (StormHead, StormBody)
    VALUES('Storms'' Flooding Delays Travel',
      'The storms'' flooding made auto travel difficult throughout December.')
    INSERT INTO StormyWeather (StormHead, StormBody)
    VALUES('Children Run from Room',
      'The children often storm out of the room when upset.')
    INSERT INTO StormyWeather (StormHead, StormBody)
    VALUES('Boy Runs from Room',
      'The boy storms out of the room when his sister changes the channel.')
    INSERT INTO StormyWeather (StormHead, StormBody)
    VALUES('Girl Ran from Room',
      'The girl stormed out of the room when her brother ate the cookie.')
    INSERT INTO StormyWeather (StormHead, StormBody)
    VALUES('Children Running from Room',
      'The children were storming out of the room when the lights went out.')
    GOcreate table #1 (
      StormID INT NOT NULL IDENTITY,
      StormHead NVARCHAR(50) NOT NULL,
      StormBody NVARCHAR(MAX) NOT NULL,  
    )
    go 
    INSERT INTO #1 (StormHead, StormBody)
    VALUES('Boy Runs from Room',
      'The boy storms out of the room when his sister changes the channel.')
    INSERT INTO #1 (StormHead, StormBody)
    VALUES('Girl Ran from Room',
      'The girl stormed out of the room when her brother ate the cookie.')
    INSERT INTO #1 (StormHead, StormBody)
    VALUES('Children Running from Room',
      'The children were storming out of the room when the lights went out.')
    go
    --用checksum计算一个值
    select CHECKSUM(StormBody)
    from StormyWeather
    /*
    (无列名)
    318284405
    -1996609556
    -957497181
    942488834
    -1966874030
    1290197037
    613467569
    706926295
    -1408726896
    1805667295
    136736880
    */
      

  9.   

    如果我没记错的话,checksum会产生重复数据,类似hashid,用md5相对更可靠些。
      

  10.   

    checksum是返回hash值,而且联机丛书上有说:
    The CHECKSUM value is dependent upon the collation. The same value stored with a different collation will return a different CHECKSUM value.
      

  11.   


    刚才花了点时间做了个测试,数据量少的话不好重现,所以不好把代码贴出来,我只把运行的结果贴出来,\\tas\WBLUE\Common\Screenshots\FT\SCS\SKY\W6M3\Localization\7025.1007\int\5001\lb-LU\IE100\FileCloud_SharingGetALinkShortenedUrl.cap -834524379
    \\tas\WBLUE\Common\Screenshots\FT\SCS\SKY\W6M3\Localization\7025.1007\int\5001\lb-LU\IE100\FileCloud_SharingGetALinkShortenedUrl.cap -834524379
    \\tas\WBLUE\Common\Screenshots\FT\SCS\SKY\W6M3\Localization\7025.1007\int\5001\lb-LU\IE100\FileCloud_SharingGetALinkShortenedUrl.cap -834524379
    \\tas\WBLUE\Common\Screenshots\FT\MSA\LiveIDWeb\W6M3\Localization\10.10.2013\Onebox\sr-Cyrl-CS\TFAUX_TFA_SwitchProofPage_SendSMS_OptIn_Snapped_Win8Wiz.cap -834524379
    \\tas\WBLUE\Common\Screenshots\FT\MSA\LiveIDWeb\W6M3\Localization\10.10.2013\Onebox\sr-Cyrl-CS\TFAUX_TFA_SwitchProofPage_SendSMS_OptIn_Snapped_Win8Wiz.cap -834524379
    \\tas\WBLUE\Common\Screenshots\FT\MSA\LiveIDWeb\W6M3\Localization\10.10.2013\Onebox\sr-Cyrl-CS\TFAUX_TFA_SwitchProofPage_SendSMS_OptIn_Snapped_Win8Wiz.cap -834524379
    \\tas\WBLUE\Common\Screenshots\FT\MSA\LiveIDWeb\W6M3\Localization\10.10.2013\Onebox\sr-Cyrl-CS\TFAUX_TFA_SwitchProofPage_SendSMS_OptIn_Snapped_Win8Wiz.cap -834524379
    \\tas\WBLUE\Common\Screenshots\FT\SCS\SKY\W6M3\Localization\7025.1007\int\5001\lb-LU\IE100\FileCloud_SharingGetALinkShortenedUrl.cap -834524379
    \\tas\WBLUE\Common\Screenshots\FT\SCS\SKY\W6M3\Localization\7024.1011\int\5001\pl-PL\IE100\OfficeCloud_BinaryConversionRetryableError.cap 1136973003
    \\tas\WBLUE\Common\Screenshots\FT\SCS\SKY\W6M3\Localization\7108.1015\int\5001\gd-GB\IE100\OfficeCloud_GroupLeaveOptionsConfirmationDialog.cap 1136973003
    \\tas\WBLUE\Common\Screenshots\FT\SP\FamilySafetyWeb\W6M1\Localization\10.23.2013\BVT\1\ig-NG\IE100\Email_ActivityReport9_Scroll_2.jpg 1938175911
    \\tas\WBLUE\Common\Screenshots\FT\SP\FamilySafetyWeb\W6M1\Localization\10.23.2013\BVT\1\ig-NG\IE100\Email_ActivityReport7_Scroll_1.jpg 1938175911注:不同的数据库,不同的表结构或者表大小的不同都可能影响checksum的值。
    从上面可以看出,虽然filepath不同但 计算出的checksum值可能相同,
    所以不能用checksum做验证方法。
      

  12.   

    而且我觉得CHECKSUM的效率也不好,我个人偏向用checksum(newid())来做随机排序,其他时间很少用
      

  13.   


    这也是个办法,不过经过各方面考虑,我还是选择修改表结构,加上一列存储MD5值:sys.fn_VarBinToHexStr(hashbytes(filePath, @src)).
    还有更新前尽量缩小要操作的数据。
    谢谢大家尤其版主“DBA_Huangzj ”的宝贵意见,
    结贴。