Anda mungkin familiar dengan SET TEXTSIZE
pernyataan di SQL Server, yang memungkinkan Anda untuk membatasi jumlah data yang dikembalikan dalam SELECT
kueri.
Mungkin Anda menemukan bahwa hasilnya persis sama dengan LEFT()
saat menjalankan kueri tertentu. Yang menimbulkan pertanyaan:Apakah ada perbedaan antara kedua opsi ini?
Pasti ada perbedaan antara kedua opsi ini. Ada kasus di mana kedua fungsi akan mengembalikan hasil yang sama sekali berbeda. Dan ada juga perbedaan dalam cara kerjanya, serta jenis data tempat mereka dapat digunakan.
Definisi
Mari kita mulai dengan melihat apa yang dilakukan masing-masing.
LEFT()
- Mengembalikan bagian kiri string karakter dengan jumlah karakter yang ditentukan.
SET TEXTSIZE
- Menentukan ukuran varchar(max) , nvarchar(maks) , varbinary(maks) , teks , nteks , dan gambar data dikembalikan oleh
SELECT
pernyataan.
Mari kita periksa ini secara detail.
Karakter vs Ukuran Data
Perhatikan kata-kata dari setiap definisi. Secara khusus, kata "karakter" vs "ukuran" dan "data".
LEFT()
memungkinkan Anda untuk secara eksplisit menyatakan berapa banyak karakter dikembalikan.SET TEXTSIZE
memungkinkan Anda untuk menentukan ukuran dari data yang dikembalikan.
Ini adalah perbedaan penting untuk dibuat, karena Anda akan mendapatkan hasil yang berbeda tergantung pada tipe datanya. Karakter yang berbeda dapat memerlukan ukuran penyimpanan yang berbeda. Satu karakter mungkin menggunakan 1 byte dan yang lain mungkin menggunakan 2 byte.
Menggunakan LEFT()
akan memungkinkan Anda untuk menentukan jumlah karakter, terlepas dari berapa banyak byte yang mereka gunakan.
SET TEXTSIZE
di sisi lain, memungkinkan Anda untuk menentukan jumlah byte untuk kembali – tidak karakter angka.
Jika data disimpan menggunakan nvarchar(max) misalnya, Anda mungkin menemukan bahwa SET TEXTSIZE
mengembalikan setengah jumlah karakter yang LEFT()
melakukan.
Contoh:
BUAT TABEL TextSizeTest ( varchar50 varchar(50), varcharMax varchar(max), nvarcharMax nvarchar(max) ); INSERT INTO TextSizeTestVALUES ( 'Dragonfruit', 'Dragonfruit', 'Dragonfruit' );SET TEXTSIZE 50;SELECT LEFT(varchar50, 4) AS varchar50, LEFT(varcharMax, 4) AS varcharMax, LEFT(nvarcharMax, 4) AS nvarcharTest;ROM TextSizeTest; SET UKURAN TEKS 4;PILIH * DARI TextSizeTest;
Hasil:
+-------------+--------------+---------------+| varchar50 | varcharMax | nvarcharMax ||-------------+--------------+---------------|| Tarik | Tarik | Seret |+-------------+--------------+---------------+(1 baris terpengaruh) Perintah berhasil diselesaikan.+-------------+--------------+------------- --+| varchar50 | varcharMax | nvarcharMax ||-------------+--------------+---------------|| Buah naga | Tarik | Dr |+-------------+--------------+---------------+(1 baris terpengaruh)
Hasil pertama adalah untuk LEFT()
. Ini bekerja di ketiga tipe dan ukuran data. Ini mengembalikan jumlah persis karakter yang ditentukan.
Hasil kedua adalah untuk SET TEXTSIZE
. Itu tidak memengaruhi varchar(50) hasil. Itu hanya mempengaruhi dua lainnya. Tapi itu mempengaruhi mereka secara berbeda. Untuk varchar(maks) , setiap karakter menggunakan 1 byte, jadi kami mendapatkan jumlah karakter yang sama yang dikembalikan sebagai TEXTSIZE
yang ditentukan . Untuk nvarchar(maks) itu cerita yang berbeda. Setiap karakter menggunakan 2 byte, jadi kami hanya mendapatkan setengah dari jumlah karakter yang dikembalikan.
Namun, hasil yang dikembalikan oleh LEFT()
masih berpotensi terpengaruh oleh SET TEXTSIZE
. Jika saya menjalankan LEFT()
kueri lagi, tetapi awali dengan SET TEXTSIZE 2
, kita mendapatkan ini:
SET TEXTSIZE 2;PILIH KIRI(varchar50, 4) AS varchar50, LEFT(varcharMax, 4) AS varcharMax, LEFT(nvarcharMax, 4) AS nvarcharMaxFROM TextSizeTest;
Hasil:
+-------------+--------------+---------------+| varchar50 | varcharMax | nvarcharMax ||-------------+--------------+---------------|| Tarik | Dr | D |+-------------+--------------+---------------+Ukuran Data Maks vs Ukuran Data Tetap
Perbedaan lainnya adalah
SET TEXTSIZE
hanya berfungsi di varchar(maks) , nvarchar(maks) , varbinary(maks) , teks , nteks , dan gambar data. Perhatikanmax
bagian. Jika Anda menggunakan ukuran data tetap (sepertivarchar(255)
misalnya),SET TEXTSIZE
tidak akan berfungsi.
LEFT()
di sisi lain, bekerja dengan semua data karakter kecuali teks dan nteks .Anda dapat melihat perbedaan ini pada contoh sebelumnya. varchar(50) data dipengaruhi oleh
LEFT()
tapi bukanSET TEXTSIZE
.LEFT() Lebih Spesifik
Perbedaan lainnya adalah
LEFT()
hanya diterapkan pada kolom (atau konstanta atau variabel) yang Anda tentukan. Jika Anda ingin menerapkannya ke beberapa kolom/ekspresi, Anda perlu memasukkannya lagi untuk setiap ekspresi. Sama dengan pertanyaan berikutnya.
SET TEXTSIZE
di sisi lain, diterapkan ke semua kolom yang berlaku yang dikembalikan dalam kueri. Ini juga diterapkan ke semua kueri hingga disetel ke nilai lain.