白空间的T-SQL处理

时间:2016-04-18 14:46:34

标签: sql sql-server whitespace

我有一个用户输入表单,由于我自己的愚蠢疏忽,用户可以输入空字符串作为识别新数据集相关的数据集的方法......

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

然而,当我尝试检索那些数据集时,我得到了所有只有空格作为标识符的数据集。

基本上问题可以隔离如下,为什么这个查询为每个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] = '   '

这更多是为了好奇,因为我的实际修复需要删除仅包含空格的标识符。

2 个答案:

答案 0 :(得分:1)

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

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

当然,它变成了一个nonSARGable谓词,但你没有多少选择,因为表允许这些数据。在这里要小心,因为LEN和DATALENGTH不完全相同。 LEN将忽略尾随空格但DATALENGTH不会。

答案 1 :(得分:1)

据我了解,sql-server在比较/连接等中使用时会修剪所有尾随空格。这实际上是ANSI标准。更多信息here