2013-01-03 5 views
0

Ok, le problème est qu'il existe une fusion ou une jointure qui doit être effectuée sur 2 tables. L'un a le contenu du fichier stocké en tant que type [image] ou varbinary (max), l'autre a le contenu du fichier stocké en tant que chaîne hexadécimale. si je télécharge le même contenu dans les deux tablesChaîne hexadécimale SQL Server à la conversion varbinary

le contenu sous forme de chaîne (bytearray à cordes) ressemblerait comme ça ...

'application/vnd.xfdl;content-encoding="base64-gzip" 
H4sIAAAAAAAAC+y9e1fjONI4/H9/Cg173idwFgIJl+5m6MzPJAayE+KsnXQPs8+cHJMY8HZi57ET 
aObMh3918UW2Jcdyrmbg7E7HtqpUpSqVSqWSdPHLj/EIPBuOa9rWl51K+WgHGNbAHprW45edpqYc 
fPp0+vmgsvNL7cPFb1eNFoDlLffLztN0Ojk/PHx5eSl3Zo4hDx+N8sAeH6Iyh2fl0x1S8Hwwc6f2'  
... 

le contenu que l'image ressemble (et ceci est finalement ce que je veulent que ça ressemble)

0x6170706C69636174696F6E 

si je sélectionne convert(varbinary(MAX), @contentAsString) je reçois 0x6100700070006C00690063006100740069006F006E

il semble que la conversion est en t Arget mais en mettant deux zéros (00) entre chaque, je vais l'appeler un octet faute de meilleurs mots.

J'ai essayé toutes sortes de méthodes plus compliquées postées sur les forums mais en vain. Toute aide serait appréciée.

+0

Dans votre Par exemple, l'autre table contient la chaîne codée en base64 et non en hexadécimal. L'exemple est ce que vous avez l'intention de recevoir en sortie ou est-ce le format source réel? –

Répondre

4

Ok, donc le 00 rembourré a été répondu.

DECLARE @hexStringNVar nvarchar(max) 
DECLARE @hexStringVAR varchar(max) 

SET @hexStringNVar = '{my hex string as described above}' 
SET @hexStringVAR = '{my hex string as described above}' 

select CONVERT(varbinary(MAX), @hexStringNVar)) = 0x6100700070006C00690063... 
select CONVERT(varbinary(MAX), @hexStringVAR)) = 0x6170706C6963... 

Le rembourrage est 00 en raison de Unicode ou NVARCHAR par opposition à VARCHAR.

Ainsi, étant donné que les données stockées est nvarchar(max), la solution est la suivante:

select CAST(cast(@hexStringNVar as varchar(max)) as varbinary(max)) = 0x6170706C6963... 

Je suis sûr que convert fonctionnerait tout aussi bien, mais mon objectif SQL Server est 2005.

+0

ou remplacez le type de stockage par 'varchar' plutôt que par' nvarchar' – GoldBishop

14

De MSDN

Dans SQL Server 2008, ces conversions sont encore plus facile puisque nous ajouté le support directement dans la CONVERT fonction intégrée. Le code échantillons ci-dessous montrent comment effectuer la conversion (s):

declare @hexstring varchar(max); 

set @hexstring = '0xabcedf012439'; 

select CONVERT(varbinary(max), @hexstring, 1); 

set @hexstring = 'abcedf012439'; 

select CONVERT(varbinary(max), @hexstring, 2); 

go 

declare @hexbin varbinary(max); 

set @hexbin = 0xabcedf012439; 

select 
    CONVERT(varchar(max), @hexbin, 1), 
    CONVERT(varchar(max), @hexbin, 2); 

go 
+0

Le @hexstring ressemble à ceci: ' 'application/vnd.xfdl, contenu encoding = "base64-gzip" H4sIAAAAAAAAC + y9e1fjONI4/H9/Cg173idwFgIJl + 5m6MzPJAayE + KsnXQPs8 + cHJMY8HZi57ET' ...' cible binaire = ' 0x6170706C69636174696F6E' 'select CONVERT (varbinary (max), @hexstring);' - réussi, mais binaire incorrect 0x6100700070006C00690063006100740069006F006E 'select CONVERT (varbinary (max), @hexstring, 1);' - failed "Erreur lors de la conversion du type de données nvarchar en varbinary " ' sélectionnez CONVERT (varbinary (max), @hexstring, 2); '- failed" Erreur lors de la conversion du type de données nvarchar en varbinary " –

+0

J'ai testé presque tout ce que je peux trouver en ligne comme les messages de type" MSDN ". La question restante est, pourquoi le générique CONVERT (varbinary (MAX), @hexstring) pad tous les 2 caractères avec 00 et est-il un moyen de se débarrasser de lui? –

Questions connexes