Tente isto:
UPDATE dbo.Login
SET
Salt=CAST('bPftidzyAQik' AS VARBINARY),
Password=0x2B89C2954E18E15759545A421D243E251784FA009E46F7A163926247FDB945F85F095DBB1FFF5B2B43A6ADAE27B8C46E176902412C4F8943E39528FF94E0DD5B
WHERE LoginID=10947
(você não precisa converter uma string armazenando um valor hexadecimal em varbinary - é exatamente o que é por padrão, sem as aspas)
A questão é:como você está gerando esse valor hexadecimal de senha e está usando a mesma codificação para gerá-lo e para lê-lo? Se você planeja converter esses dados de volta em uma string, precisará de algum código para fazer isso. Aqui está uma função que escrevi que faz isso:
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
No entanto, não sei o quanto isso será útil para você, pois é muito possível que qualquer aplicativo que esteja usando esses campos esteja lidando com os valores de maneira diferente do que essa função espera. Para o registro, esta função recebe um valor varbinary que era originalmente uma string utf-8 e retorna o valor varchar dessa string. Boa sorte!