Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

LEFT() vs SET TEXTSIZE di SQL Server:Apa Bedanya?

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. Perhatikan max bagian. Jika Anda menggunakan ukuran data tetap (seperti varchar(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 bukan SET 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dapatkan semua tanggal antara dua tanggal di SQL Server

  2. operasi tidak diizinkan ketika objek ditutup saat menjalankan kueri yang lebih maju

  3. Mengukur Kinerja Kueri:Biaya Kueri Rencana Eksekusi vs Waktu yang Dibutuhkan

  4. Cara Menemukan Pengaturan ANSI_NULLS Database di SQL Server (T-SQL)

  5. Membagi Partisi menjadi Dua di SQL Server (T-SQL)