是否可以将ascii值放入sql server 2008 r2中的变量中?我尝试这段代码:
declare @thechars varchar(15)
declare @theascii varchar(50)
declare @position int
set @thechars = 'somechar'
set @theascii = ''
set @position = 1
while(@position<16)
begin
set @theascii = @theascii+convert(varchar,ascii(substring(@thechars ,@position,1)))
set @position = @position + 1
end
print '-------------------------'
print 'the ascii is ' + @theascii
print '-------------------------'
但结果如下:
-------------------------
-------------------------
有什么方法可以解决我的问题吗?
答案 0 :(得分:2)
使用
while(@position <= LEN(@thechars))
我不知道为什么你在你的版本中硬编码16
。
在字符串长度之后尝试提取SUBSTRING
返回NULL
,这意味着整个连接字符串为NULL
。
如果你必须这样做,那么另一种方法是在连接之前用空字符串替换NULL
。
SET @theascii += ISNULL(CONVERT(VARCHAR(3),ASCII(SUBSTRING(@thechars ,@position,1))),'')
答案 1 :(得分:0)
您似乎正在尝试执行以下操作。
注意,我已经包含了Tally \ Numbers表的想法,而不是使用循环。 Tally表通常被认为更具性能。 请阅读它们。
DECLARE @InputText VARCHAR(50) = 'Hello, world!'
,@ASCIIString VARCHAR(200) = ''
;WITH TallyCTE (n) AS
-- You may want to create a physical Tally table - Google & read up!
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM syscolumns
)
SELECT @ASCIIString = @ASCIIString + CAST(ASCII(SUBSTRING(@InputText, n, 1)) AS VARCHAR) + ', '
FROM TallyCTE
WHERE n <= LEN(@InputText)
PRINT 'The ASCII lookup values are; ' + LEFT(@ASCIIString, LEN(@ASCIIString)-1)
答案 2 :(得分:-1)
不要在WHILE LOOP中硬编码长度。有时,给定的输入长度可能超过您的硬编码值。但是你仍然会得到一些输出。如果长度小于该值,您将获得空值。如果使用'SELECT'语句而不是PRINT,则输出为NULL。
处理此问题
用 LEN(@thechars)
替换硬编码值
或者
处理 NULL :ISNULL(CONVERT(VARCHAR,ASCII(SUBSTRING(@ thechars,@ position,1))),'')
第一个是最好的