Hãy thử điều này:
UPDATE dbo.Login
SET
Salt=CAST('bPftidzyAQik' AS VARBINARY),
Password=0x2B89C2954E18E15759545A421D243E251784FA009E46F7A163926247FDB945F85F095DBB1FFF5B2B43A6ADAE27B8C46E176902412C4F8943E39528FF94E0DD5B
WHERE LoginID=10947
(bạn không cần truyền một chuỗi lưu trữ giá trị hex thành varbinary - đó chỉ là theo mặc định, không có dấu ngoặc kép)
Câu hỏi đặt ra là, bạn đang tạo giá trị hex của mật khẩu đó như thế nào và bạn có đang sử dụng cùng một kiểu mã hóa để tạo nó như cách bạn đọc không? Nếu bạn đang có kế hoạch chuyển đổi dữ liệu đó trở lại thành một chuỗi, bạn sẽ cần một số mã để làm như vậy. Đây là một chức năng tôi đã viết để thực hiện điều này:
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
Tuy nhiên, tôi không biết điều này sẽ hữu ích như thế nào đối với bạn, vì rất có thể bất kỳ ứng dụng nào đang sử dụng các trường này đang xử lý các giá trị khác với mong đợi của hàm này. Đối với bản ghi, hàm này nhận một giá trị varbinary mà ban đầu là chuỗi utf-8 và trả về giá trị varchar của chuỗi đó. Chúc bạn thành công!