在搜索TEXT列中的空格时,CHARINDEX始终返回0

Wil*_*yer 5 sql t-sql sql-server sql-server-2008-r2

--get text target starting integers into a table

declare @target TABLE([USERID] varchar(25),[target] int)

--get text stopping point integers into a table

declare @stop TABLE([USERID] varchar(25),[target] int, [stop] int)

--get just the options I want into a table

declare @options TABLE ([USERID] varchar(25), [userDetails] text)
insert into @options ([userid], [userDetails])
select u.userid, rtrim(ltrim(SUBSTRING([userDetails], s.[target], s.[stop] - s.[target])))
from users u join @stop s on u.userid = s.userid

declare @userDetails varchar(max)
Select top 1
@userDetails = [userDetails]
from @options
select charindex(char(32), @userDetails)
Run Code Online (Sandbox Code Playgroud)

所有我得到的都是这个charindex的0,我试过''而不是char(32).我已经尝试将文本更改为varchar但是从我可以看到的内容是没有意义的,因为文本被弃用并且已经被视为varchar?

当我将userDetails片段复制并粘贴到单个带引号的字符串中并将其放入charindex函数时,事情按预期工作.

填充@userDetails的源文本如下所示:

key = value key = value key = value

Wil*_*yer 3

切换到 SSMS 中的“结果到文本”,查看真正输出的内容。如果您处于“结果到网格”中,CRLF 将转换为空格。

正如@PhilipKelley 在评论中提到的,

列之间的移动被转换为 [tab] 字符...

现在搜索 char(13) 或回车符可以让我找到每个 Key=Value 对之间的字符。它还解释了为什么有 2 个空格,这些是写入此数据的程序用来分解每个条目的 CRLF

@Dems,提醒我了

“空白”涵盖制表符、回车符和一大堆其他实体,

在本网站的另一个讨论中也讨论了类似的主题