2010-12-20 20 views
2

Ich versuche den Inhalt eines VARCHAR-Felds in eine eindeutige Zahl zu konvertieren, die von einem Drittanbieter leicht referenziert werden kann.Varchar in Ascii konvertieren

Wie kann ich ein Varchar in die Ascii-Zeichenkette umwandeln? In TSQL? Die ASCII() -Funktion konvertiert ein einzelnes Zeichen, aber was kann ich tun, um eine ganze Zeichenfolge zu konvertieren?

Ich habe versucht,

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

mit .... aber das ist langweilig, dumm suchen, und funktioniert einfach nicht richtig funktionieren, wenn ich lange Strings hatte. Oder wenn es besser ist, wie würde ich dasselbe in SSRS machen?

+0

Wie könnte lange die Zeichenfolge konvertiert werden sein? Alles nach 3 Zeichen wird wirklich hässlich schnell. –

+0

Sicherlich lange genug, dass ich etwas anderes suchen muss. Ich habe ein paar 30 Zeichen Saiten. –

+0

Dies funktioniert nur bis zu 100 als Rekursionsgrenze. Wenn Sie eine Zeichenfolge haben, die länger als 100 ist, wird die Ausführung beendet, nachdem das Limit erreicht wurde. –

Antwort

8

versuchen, etwas wie folgt aus:

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 

OUTPUT:

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

(1 row(s) affected) 

nur um es zu testen:

;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 

OUTPUT:

    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) 

Auch sollten Sie diese verwenden:

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

alle ASCII-Werte in drei Ziffern zu zwingen, ich bin nicht sicher, ob dies auf der Grundlage Ihrer Nutzung notwendig ist oder nicht.

Ausgabe mit 3 Stellen pro Zeichen:

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

(1 row(s) affected) 
+0

Wenn jemand diesen Code mit einer Zeichenfolge verwendet, die Leerzeichen enthalten könnte, würde ich empfehlen, alle Verwendungen der 'LEN()' -Funktion durch 'zu ersetzen DATALÄNGE() '. – AHiggins

0

Nun, ich denke, dass eine Lösung für dieses Problem wird sehr langsam sein, aber ich denke, dass man so etwas tun könnte:

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 

Ich bin nicht in einem PC mit einem Datenbank-Engine, so dass ich kann diesen Code nicht wirklich testen. Wenn es funktioniert, können Sie basierend darauf eine UDF erstellen.