sql >> Databasteknik >  >> RDS >> Sqlserver

Hur uppdaterar man ett varbinärt fält med ett specifikt värde?

Prova detta:

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

(du behöver inte casta en sträng som lagrar ett hexadecimalt värde till varbinary - det är precis vad det är som standard, utan citattecken)

Frågan är, hur genererar du det hexadecimala lösenordet och använder du samma kodning för att generera det som du ska läsa det? Om du planerar att konvertera den datan tillbaka till en sträng behöver du lite kod för att göra det. Här är en funktion jag skrev som gör detta:

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 

Jag vet dock inte hur användbart detta kommer att vara för dig, eftersom det är mycket möjligt att vilken app som helst som använder dessa fält hanterar värdena annorlunda än den här funktionen förväntar sig. För att ta reda på att den här funktionen tar ett varbinärt värde som ursprungligen var utf-8-sträng och returnerar varchar-värdet för den strängen. Lycka till!



  1. Prestanda för underfråga i IN-klausul med stora tabeller i raderingsfråga

  2. Oracle Entity Framework - Generera entitet från tabeller i olika scheman

  3. Generera sekvensnummer i select

  4. Hur gör man LEFT JOIN med fler än 2 bord?