我有一个用户输入表单,由于我自己的愚蠢疏忽,用户可以输入空字符串作为识别新数据集相关的数据集的方法......
这导致多个数据集被记录为空标识符,或由多个"空格"组成的标识符。字符。这些对于用户来说是无法区分的,因为它们都显得空洞,但是我不会期望这是一个编程问题,因为字符串是不同的。
然而,当我尝试检索那些数据集时,我得到了所有只有空格作为标识符的数据集。
基本上问题可以隔离如下,为什么这个查询为每个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] = ' '
这更多是为了好奇,因为我的实际修复需要删除仅包含空格的标识符。
答案 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。