2010-12-20 5 views
2

J'essaie de convertir le contenu d'un champ VARCHAR en un nombre unique pouvant être facilement référencé par un tiers.Convertir Varchar en Ascii

Comment est-ce que je peux convertir un varchar à l'équivalent de corde ascii? En TSQL? La fonction ASCII() convertit un seul caractère mais que puis-je faire pour convertir une chaîne entière?

J'ai essayé d'utiliser

CAST(ISNULL(ASCII(Substring(RTRIM(LTRIM(PrimaryContactRegion)),1,1)),'')AS VARCHAR(3)) 
+ CAST(ISNULL(ASCII(Substring(RTRIM(LTRIM(PrimaryContactRegion)),2,1)),'')AS VARCHAR(3)) 

.... mais c'est pénible, stupide regarder, et ne fonctionne tout simplement pas vraiment si j'avais les longues chaînes. Ou si c'est mieux, comment ferais-je la même chose dans SSRS?

+0

Combien de temps peut la chaîne à convertir soit? Quelque chose au-delà de 3 personnages devient vraiment laid très vite. Certainement –

+0

assez longtemps que je devrai chercher quelque chose de différent. J'ai un couple de 30 chaînes de caractères. –

+0

Cela ne fonctionne que jusqu'à 100 comme la limite de récursivité. Si vous avez une chaîne de plus de 100, il arrêtera l'exécution après avoir atteint la limite –

Répondre

8

essayer quelque chose comme ceci:

DECLARE @YourString varchar(500) 

SELECT @YourString='Hello World!' 

;WITH AllNumbers AS 
(
    SELECT 1 AS Number 
    UNION ALL 
    SELECT Number+1 
     FROM AllNumbers 
     WHERE Number<LEN(@YourString) 
) 
SELECT 
     (SELECT 
      ASCII(SUBSTRING(@YourString,Number,1)) 
      FROM AllNumbers 
      ORDER BY Number 
      FOR XML PATH(''), TYPE 
     ).value('.','varchar(max)') AS NewValue 
     --OPTION (MAXRECURSION 500) --<<needed if you have a string longer than 100 

SORTIE:

NewValue 
--------------------------------------- 
72101108108111328711111410810033 

(1 row(s) affected) 

juste pour le tester:

;WITH AllNumbers AS 
(
    SELECT 1 AS Number 
    UNION ALL 
    SELECT Number+1 
     FROM AllNumbers 
     WHERE Number<LEN(@YourString) 
) 
SELECT SUBSTRING(@YourString,Number,1),ASCII(SUBSTRING(@YourString,Number,1)),* FROM AllNumbers 

SORTIE:

    Number 
---- ----------- ----------- 
H 72   1 
e 101   2 
l 108   3 
l 108   4 
o 111   5 
    32   6 
W 87   7 
o 111   8 
r 114   9 
l 108   10 
d 100   11 
! 33   12 

(12 row(s) affected) 

En outre, vous pouvez utiliser ceci:

RIGHT('000'+CONVERT(varchar(max),ASCII(SUBSTRING(@YourString,Number,1))),3) 

pour forcer toutes les valeurs ASCII en 3 chiffres, je ne sais pas si cela est nécessaire en fonction de votre utilisation ou non.

sortie en utilisant 3 chiffres par caractère:

NewValue 
------------------------------------- 
072101108108111032087111114108100033 

(1 row(s) affected) 
+0

Si quelqu'un utilise ce code avec une chaîne qui peut contenir des espaces de fin, je vous recommande de remplacer toutes les utilisations de la fonction 'LEN()' 'avec DATALENGTH() '. – AHiggins

0

Eh bien, je pense qu'une solution à ce sera très lent, mais je pense que vous pourriez faire quelque chose comme ceci:

DECLARE @count INT, @string VARCHAR(100), @ascii VARCHAR(MAX) 

SET @count = 1 
SET @string = 'put your string here' 
SET @ascii = '' 

WHILE @count <= DATALENGTH(@string) 
BEGIN 
    SELECT @ascii = @ascii + '&#' + ASCII(SUBSTRING(@string, @count, 1)) + ';' 
    SET @count = @count + 1 
END 

SET @ascii = LEFT(@ascii,LEN(@ascii)-1) 
SELECT @ascii 

Je ne suis pas dans un pc avec un moteur de base de données, donc je ne peut pas vraiment tester ce code. Si cela fonctionne, vous pouvez créer un fichier UDF basé sur ceci.