Jawaban:
Semuanya sesuai dengan standar ANSI:
SQL Server mengikuti spesifikasi ANSI / ISO SQL-92 (Bagian 8.2,, Aturan umum # 3) tentang cara membandingkan string dengan spasi. Standar ANSI membutuhkan padding untuk string karakter yang digunakan dalam perbandingan sehingga panjangnya cocok sebelum membandingkannya. Padding secara langsung mempengaruhi semantik predikat klausa WHERE dan HAVING dan perbandingan string Transact-SQL lainnya. Sebagai contoh, Transact-SQL menganggap string 'abc' dan 'abc' setara untuk sebagian besar operasi perbandingan.
Satu-satunya pengecualian untuk aturan ini adalah predikat LIKE. Ketika sisi kanan dari ekspresi predikat LIKE fitur nilai dengan spasi tambahan, SQL Server tidak memadatkan dua nilai dengan panjang yang sama sebelum perbandingan terjadi. Karena tujuan dari predikat LIKE, menurut definisi, adalah untuk memfasilitasi pencarian pola daripada tes persamaan string sederhana, ini tidak melanggar bagian dari spesifikasi ANSI SQL-92 yang disebutkan sebelumnya.
Berikut adalah contoh umum dari semua kasus yang disebutkan di atas:
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
Berikut ini beberapa detail tentang tertinggal kosong dan LIKE
klausa .
TETAPI jika Anda ingin membuatnya berbeda - Anda dapat memutuskan untuk menggunakan DATALENGTH
fungsi alih-alih LEN
, karena
SELECT 1 WHERE LEN('John ') = LEN('John')
akan menempatkan Anda 1 sebagai gantinya
SELECT 1 WHERE DATALENGTH('John ') = DATALENGTH('John')
Solusinya adalah
Anda bisa menambahkan ruang putih ke kondisi Anda.
set @X= 'John \n'
\n
tidak memiliki arti dalam SQL Server. Itu tidak ditafsirkan sebagai baris baru. Lagi pula, ini bukan jawaban untuk pertanyaan yang diajukan.