T-SQL 处理白-Space

T-SQL Handling of White-Space

我有一个用户输入表单,由于我自己的愚蠢疏忽,它允许用户输入空字符串,以此作为识别新数据集与哪个数据集相关的一种方式...

这导致多个数据集被记录为空标识符,或由多个 "space" 字符组成的标识符。这些对于用户来说是无法区分的,因为它们都显示为空,但是我不认为这是一个编程问题,因为字符串不同。

然而,当我尝试检索该数据集时,我得到的所有数据集都只有 white-space 作为标识符。

基本上问题可以如下隔离,为什么这个查询为每个 SELECT 产生 4 行结果,而不只是实际匹配的结果?

DECLARE @testTable TABLE ([NumberOfSpaces] INT, [SpaceString] VARCHAR(50))

INSERT INTO @testTable ([NumberOfSpaces],[SpaceString]) VALUES
(0,''),
(1,' '),
(2,'  '),
(3,'   ')

SELECT * FROM @testTable WHERE [SpaceString] = ''
SELECT * FROM @testTable WHERE [SpaceString] = ' '
SELECT * FROM @testTable WHERE [SpaceString] = '  '
SELECT * FROM @testTable WHERE [SpaceString] = '   '

这更多是出于好奇,因为我的实际修复需要删除仅包含 white-space.

的标识符

您可以在 where 子句中添加一个额外的谓词来检查 DATALENGTH。

declare @SpaceString varchar(10) = '  '
SELECT * 
FROM @testTable 
WHERE [SpaceString] = ''
and DATALENGTH(SpaceString) = DATALENGTH(@SpaceString)

当然这变成了一个非 SARGable 谓词,但是你没有太多选择,因为 table 允许这个数据进入。这里要小心,因为 LEN 和 DATALENGTH 不完全相同。 LEN 将忽略尾随空格,但 DATALENGTH 不会。

据我了解,sql-server 在 comparisons/joins 等中使用时会修剪所有尾随的白色 space。这实际上是 ANSI 标准。更多信息 here.