Yanıtlar:
Her şey sadece ANSI standardına göre:
SQL Server, dizelerin boşluklarla nasıl karşılaştırılacağı konusunda ANSI / ISO SQL-92 spesifikasyonunu (Bölüm 8.2, Genel kurallar # 3) takip eder. ANSI standardı, karşılaştırmalarda kullanılan karakter dizileri için dolgulama gerektirir, böylece uzunlukları karşılaştırmadan önce eşleşir. Dolgu, WHERE ve HAVING yan tümcesinin tahminlerini ve diğer Transact-SQL dize karşılaştırmalarının anlamını doğrudan etkiler. Örneğin, Transact-SQL 'abc' ve 'abc' dizelerini çoğu karşılaştırma işlemi için eşdeğer kabul eder.
Bu kuralın tek istisnası LIKE yüklemidir. LIKE yüklem ifadesinin sağ tarafında bir boşluk bulunan bir değer olduğunda, SQL Server karşılaştırma yapılmadan önce iki değeri aynı uzunlukta doldurmaz. LIKE yükleminin amacı, tanım gereği, basit dize eşitliği testlerinden ziyade desen aramalarını kolaylaştırmak olduğundan, bu, daha önce bahsedilen ANSI SQL-92 spesifikasyonunun bölümünü ihlal etmez.
Yukarıda belirtilen tüm vakaların iyi bilinen bir örneği:
DECLARE @a VARCHAR(10)
DECLARE @b varchar(10)
SET @a = '1'
SET @b = '1 ' --with trailing blank
SELECT 1
WHERE
@a = @b
AND @a NOT LIKE @b
AND @b LIKE @a
İşte boşlukları ve LIKE
fıkra hakkında biraz daha ayrıntı .
ANCAK onları farklılaştırmak istiyorsanız - DATALENGTH
fonksiyon yerine kullanmaya karar verebilirsiniz LEN
, çünkü
SELECT 1 WHERE LEN('John ') = LEN('John')
yerine 1 tane koyacağım
SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')
çözelti bir
\n
SQL Server'da bir önemi yoktur. Yeni bir satır olarak yorumlanmaz. Bu zaten sorulan sorunun cevabı değil.