如何使用特定值更新varbinary字段?

时间:2011-12-19 20:36:20

标签: sql sql-server-2008 sql-server-2008-r2 sql-update varbinary

基本上我试图给用户一个特定的密码,所以我可以在系统上测试一些功能,因为我只有我们的管理员帐户而且我不能玩我只是选择一个随机帐户所以我可以做我的测试。所以这是我尝试更新:

UPDATE dbo.Login
SET
  Salt=CAST('bPftidzyAQik' AS VARBINARY),
  Password=CAST('0x2B89C2954E18E15759545A421D243E251784FA009E46F7A163926247FDB945F85F095DBB1FFF5B2B43A6ADAE27B8C46E176902412C4F8943E39528FF94E0DD5B' AS VARBINARY)
WHERE LoginID=10947

它运行正常然而数据库中的代码看起来是日语的一个而另一个的语法看起来很好但它不是我放入的值,我希望它使用我输入的确切值所以我可以签名in。我该怎么办?我尝试了几种不同的演员和转换解决方案,没有运气。

2 个答案:

答案 0 :(得分:33)

试试这个:

UPDATE dbo.Login
SET
  Salt=CAST('bPftidzyAQik' AS VARBINARY),
  Password=0x2B89C2954E18E15759545A421D243E251784FA009E46F7A163926247FDB945F85F095DBB1FFF5B2B43A6ADAE27B8C46E176902412C4F8943E39528FF94E0DD5B
WHERE LoginID=10947

(你不需要将存储十六进制值的字符串转换为varbinary - 默认情况下它是什么,没有引号)

问题是,您如何生成该密码十六进制值,并且您是否使用相同的编码来生成它,因为您要阅读它?如果您计划将该数据转换回字符串,则需要一些代码才能执行此操作。这是我写的一个函数:

CREATE FUNCTION ConvertBinary
(  
    @value AS varbinary(max)
) RETURNS VARCHAR(MAX) AS BEGIN  

    DECLARE @result AS varbinary(max),
            @result2 AS varchar(max),
            @idx AS bigint;

    IF @value IS null
        return null;

    SELECT @result = @value;  
    SELECT @result2 = '';
    SELECT @idx = 1;

    WHILE substring(@result, @idx, 1) != 0 AND @idx < len(@result)
        BEGIN
            SET @result2 = @result2 + cast(substring(@result,@idx,1) as char(1));  
            SET @idx = @idx + 1;
        END

    RETURN @result2;  

END 

我不知道这会对你有多大帮助,因为无论使用这些字段的应用程序是否都有可能以不同于此函数的方式处理值。对于记录,此函数采用varbinary值,该值最初为utf-8字符串,并返回该字符串的varchar值。祝你好运!

答案 1 :(得分:2)

由于您使用的是2008,请尝试以下方法:

UPDATE dbo.Login 
SET 
    Salt=CAST('bPftidzyAQik' AS VARBINARY),   
    Password=CONVERT(VARBINARY(MAX), '0x2B89C2954E18E15759545A421D243E251784FA009E46F7A163926247FDB945F85F095DBB1FFF5B2B43A6ADAE27B8C46E176902412C4F8943E39528FF94E0DD5B', 1) 
WHERE LoginID=10947 

http://blogs.msdn.com/b/sqltips/archive/2008/07/02/converting-from-hex-string-to-varbinary-and-vice-versa.aspx