Tsql 将Varchar转换为Ascii

Tsql 将Varchar转换为Ascii,tsql,ssrs-2008,Tsql,Ssrs 2008,我试图将VARCHAR字段的内容转换为唯一的数字,以便第三方轻松引用 如何将varchar转换为等效的ascii字符串?在TSQL中?函数的作用是:转换单个字符,但如何转换整个字符串 我试过使用 CAST(ISNULL(ASCII(Substring(RTRIM(LTRIM(PrimaryContactRegion)),1,1)),'')AS VARCHAR(3)) + CAST(ISNULL(ASCII(Substring(RTRIM(LTRIM(PrimaryContactRegion)),

我试图将VARCHAR字段的内容转换为唯一的数字,以便第三方轻松引用

如何将varchar转换为等效的ascii字符串?在TSQL中?函数的作用是:转换单个字符,但如何转换整个字符串

我试过使用

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中做同样的事情呢?

好吧,我认为解决这个问题的方法会非常慢,但我想你可以这样做:

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
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
声明@count INT、@string VARCHAR(100)、@ascii VARCHAR(MAX)
设置@count=1
SET@string='把你的字符串放在这里'
设置@ascii=“”

当@count尝试以下方法时:

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
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
只是为了验证一下:

;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
此外,您可能希望使用以下选项:

RIGHT('000'+CONVERT(varchar(max),ASCII(SUBSTRING(@YourString,Number,1))),3)
为了将所有ASCII值强制转换为3位数字,我不确定根据您的使用情况是否有必要这样做

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

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

(1 row(s) affected)

要转换的字符串可能有多长?任何超过3个角色的东西都会很快变得很难看。当然足够长了,我需要寻找一些不同的东西。我有几个30个字符的字符串。作为递归限制,它最多只能工作100个字符。如果您的字符串长度超过100,它将在达到限制后停止执行。如果任何人使用此代码的字符串可能包含尾随空格,我建议将
LEN()
函数的所有用法替换为
DATALENGTH()
。这非常好。如果有必要,我做了一个小小的改动,让它更容易阅读
RIGHT('000'+CONVERT(varchar(max)、ASCII(SUBSTRING(@YourString,Number,1))、3)+'、'
您需要围绕主SELECT语句的ASCII部分使用CAST或CONVERT语句,以使此解决方案起作用,例如
CAST(ASCII(SUBSTRING(@string,@count,1))作为varchar)