【发布时间】:2017-12-08 13:50:07
【问题描述】:
我有一个包含 nvarchar(max) 列的 SQL Server 表。我运行了一个查询来选择该列包含字符串“remove”的每一行。在结果中,我有几行在此列中填充了一个空字符串,我不明白为什么会返回这些值。
我试图进一步调查返回的空字符串值之一。我发现空字符串值将匹配某些LIKE 条件,但不匹配其他条件。例如,它会匹配到%remove% 和%x%,但不会匹配到%q%。
在 SQL Server Management Studio 的结果网格中,nvarchar 字段显示为空字段(不为空)。但是,如果我将len() 函数应用于此字段,它会返回值 649。当我将结果表从 SQL Server Management Studio 导出到 Excel 时,nvarchar(max) 字段为空。
假设必须有一堆空白字符填充该字段,我尝试在将“x”连接到返回值的任一端后选择该字段。结果中,开头的“x”出现在字符串的开头,但不显示连接到结尾的“x”。
我完全不知道发生了什么。我可以根据要求提供更多信息。
select itemid, content
from objects
where itemid = 100 and content like '%remove%'
----------------
itemid | content
100 |
select itemid, 'x' + content + 'x' as 'content'
from objects
where itemid = 100 and content like '%remove%'
----------------
itemid | content
100 | x
编辑:
修剪字段不会改变字符数。但是,当我确实使用子字符串选择连接输出中的最后一个字符时,返回的字符是“x”,这表明由于字符串的长度,它在 GUI 输出中不可见。不过,在将内容导出到 Excel 时,我仍然看不到这个尾随的“x”字符。我认为 nvarchar 变量中可能存在不受支持的字符。
select itemid, 'x' + ltrim(rtrim(content)) + 'x' as 'content'
from objects
where itemid = 100 and content like '%remove%'
----------------
itemid | content
100 | x
【问题讨论】:
-
我无法重现,您真的在完全相同的条件下进行了测试吗?
-
我can't reproduce this behavior。你能提供一个可重复的样品吗?
-
你试过在你的领域使用 LTRIM() 吗?这将删除字符串左侧的所有前导空格。您还可以查看分析 LEN(LTRIM(RTRIM(content))) ,这将删除前导或尾随空格并为您提供长度。
-
正如其他人所提到的,该列可能充满了空格(或其他不可显示的字符),而不是实际上是空的。很难看,但长度值是一个很大的赠品。根据您在 GUI 中显示该列的宽度,稍后在该字段中它包含您搜索的值可能并不明显。也许将结果粘贴到 Notepad++ 等文本编辑器中,您可以看到整个内容,并且您会很容易看到其中是否有空格、制表符等。
-
您的第二个查询似乎有问题,特别是
'x' + content + 'x'。根据您的输出,结果是x。这不可能。'x' + '' + 'x'将导致xx。'x' + ' ' + 'x'将导致'x x'。最后,'x' + NULL + 'x'将导致NULL我感觉其他 x 在您的输出中,但您在右侧的滚动不够。
标签: sql sql-server sql-like