How can I make SQL Server return FALSE for comparing varchars with and without trailing spaces?
From the docs on LEN (Transact-SQL):
Returns the number of characters of the specified string expression, excluding trailing blanks. To return the number of bytes used to represent an expression, use the
DATALENGTH
function
Also, from the support page on How SQL Server Compares Strings with Trailing Spaces:
SQL Server follows the ANSI/ISO SQL-92 specification on how to compare strings with spaces. The ANSI standard requires padding for the character strings used in comparisons so that their lengths match before comparing them.
Update: I deleted my code using LIKE
(which does not pad spaces during comparison) and DATALENGTH()
since they are not foolproof for comparing strings
This has also been asked in a lot of other places as well for other solutions:
- SQL Server 2008 Empty String vs. Space
- Is it good practice to trim whitespace (leading and trailing)
- Why would SqlServer select statement select rows which match and rows which match and have trailing spaces
you could try somethign like this:
declare @a varchar(10), @b varchar(10)
set @a='foo'
set @b='foo '
select @a, @b, DATALENGTH(@a), DATALENGTH(@b)
After some search the simplest solution i found was in Anthony Bloesch WebLog.
Just add some text (a char is enough) to the end of the data (append)
SELECT 'foo' WHERE 'bar' + 'BOGUS_TXT' = 'bar ' + 'BOGUS_TXT'
Also works for 'WHERE IN'
SELECT <columnA>
FROM <tableA>
WHERE <columnA> + 'BOGUS_TXT' in ( SELECT <columnB> + 'BOGUS_TXT' FROM <tableB> )