2010-12-20 152 views
2

我试图将VARCHAR字段的内容转换为可由第三方轻松引用的唯一编号。将Varchar转换为Ascii

如何将varchar转换为ascii字符串等效项?在TSQL中? ASCII()函数转换单个字符,但我能做些什么来转换整个字符串?

我使用

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

试图....但这是乏味的,愚蠢的期待,只是并未真正发挥作用,如果我有很长的字符串。或者如果更好,我将如何在SSRS中做同样的事情?

+0

多久可以将字符串转换呢?任何超过3个字符的东西都会变得真实丑陋。 – 2010-12-20 17:41:19

+0

当然足够长,我需要找出不同的东西。我有几个30个字符的字符串。 – 2010-12-20 17:48:15

+0

这仅适用于递归限制100。如果你有一个字符串长度超过100,它会在达到限制后停止执行 – 2015-03-10 21:43:06

回答

8

尝试这样:

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) 

只是为了测试一下:

;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) 

此外,您可能想要使用此:

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

强制所有ASCII值到3个数字,我不知道这是否是必要根据您的使用与否。

每个字符使用3个数字输出:

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

(1 row(s) affected) 
+0

如果有人用一个可能包含尾随空格的字符串来使用这段代码,我建议用'LEN()'函数替换' DATALENGTH()'。 – AHiggins 2015-02-16 14:24:16

0

嗯,我认为这个解决方案将是非常缓慢的,但我想你可以做这样的事情:

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 

我不是在同一个数据库引擎的电脑,所以我不能真正测试这个代码。如果它有效,那么你可以在此基础上创建一个UDF。