2009-07-02 9 views
0

Je suis en train de prendre un VARCHAR(MAX) comportant des données comme suit: « 00001001010001010111010101 ... », etc.Comment puis-je convertir une chaîne binaire codée en caractères hexadécimaux dans SQL Server?

encodent ensuite comme hexadécimal de retour plus efficace au client.

Est-ce possible? Soit directement ou en convertissant la chaîne dans une colonne binaire réelle d'abord avant d'appeler master.dbo.fn_varbintohexstr?

À titre d'exemple, étant donné la chaîne:

0000100101000101011101011110 

Nous devrions finir avec:

0000 = 0 
1001 = 9 
0100 = 4 
0101 = 5 
0111 = 7 
0101 = 5 
1110 = E 

094575E. Ou s'il y a une méthode encore plus efficace (lecture binaire directement?) Alors ce serait encore mieux. Les solutions compatibles SQL Server 2000 sont préférables.

+0

est votre seule option dans la base de données? et sera-t-il sur demande ou couru une fois? –

+1

Ne serait-il pas juste ... que le retour des données binaires brutes soit plus efficace que ce type de manipulation contorsionniste? – Shog9

+0

ce n'est pas - mais ce sera sur demande et je voudrais garder le fil sur le minimum si possible. –

Répondre

4

Étant donné votre question précédente, vous générez cette chaîne dans le cadre d'une autre requête. Pourquoi sur Terre générez-vous une chaîne de uns et de zéros quand vous pouvez simplement les multiplier par la puissance appropriée de 2 pour en faire un INT au lieu d'une chaîne? La conversion de INT en chaîne hexadécimale est triviale.

+0

Je savais que j'aurais dû expliquer :) Il s'agit essentiellement d'un champ de bits qui a été "pivoté" et concaténé mais sans utiliser de pivot (comme je dois wrok dans les contraintes de 2000). J'avoue que ça a l'air fou - mais y a-t-il un moyen de le faire quand même? –

+0

Quelle que soit la solution que vous finissez avec, il devrait y avoir une table en bois quelque part. – TheTXI

+2

@Kieran Benton: Vous faites cela de façon détournée.Vous convertissez de binaire en chaîne, puis vous voulez convertir de chaîne en numérique puis en chaîne hexadécimale. Vous feriez mieux de passer directement du format binaire au format numérique, de cette façon vous pouvez l'éditer dans la base de votre choix. Vous construisez une chaîne de nombres en quelque sorte. Tout ce que vous devez faire est de construire un INT ou BIGINT à la place. Utilisez l'addition et la multiplication au lieu de la concaténation. – Welbog

-1

Vous cherchez quelque chose comme ceci: http://support.microsoft.com/kb/104829

Ici, il est dans le cas où le lien meurt jamais: (! À partir de la fin)

create procedure sp_hexadecimal 
    @binvalue varbinary(255) 
    as 
    declare @charvalue varchar(255) 
    declare @i int 
    declare @length int 
    declare @hexstring char(16) 

    select @charvalue = '0x' 
    select @i = 1 
    select @length = datalength(@binvalue) 
    select @hexstring = "abcdef" 

    while (@i <= @length) 
    begin 

    declare @tempint int 
    declare @firstint int 
    declare @secondint int 

    select @tempint = convert(int, substring(@binvalue,@i,1)) 
    select @firstint = floor(@tempint/16) 
    select @secondint = @tempint - (@firstint*16) 

    select @charvalue = @charvalue + 
     substring(@hexstring, @firstint+1, 1) + 
     substring(@hexstring, @secondint+1, 1) 

    select @i = @i + 1 

    end 

    select 'sp_hexadecimal'[email protected] 
1

Vous pouvez toujours diviser la chaîne en 4 groupes char , en utilisant SUBSTRING, et cast les 4 groupes de caractères au chiffre hexadécimal, par exemple. '0011' à '3' dans une grosse déclaration CASE. Il n'y a que 16 commutateurs dans le CASE, donc plus que gérable. Mais tout ce que vous obtenez est une réduction de 4 fois en longueur, pas sûr si cela vaut la surcharge (significative) du serveur juste pour réduire le trafic.

0

Une autre solution pourrait être d'implémenter une fonction définie par l'utilisateur en utilisant votre langage .NET préféré

Questions connexes