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

SQL Server secara diam-diam memotong varchar dalam prosedur tersimpan

Itu hanya adalah .

Saya tidak pernah melihat masalah karena salah satu pemeriksaan saya adalah memastikan parameter saya cocok dengan panjang kolom tabel saya. Dalam kode klien juga. Secara pribadi, saya berharap SQL tidak pernah melihat data yang terlalu panjang. Jika saya benar-benar melihat data yang terpotong, pasti penyebabnya berdarah.

Jika Anda merasa perlu untuk varchar(max) waspadalah terhadap masalah kinerja besar-besaran karena prioritas tipe data. varchar(max) memiliki prioritas lebih tinggi daripada varchar(n) (terpanjang adalah tertinggi). Jadi dalam jenis kueri ini Anda akan mendapatkan pemindaian bukan pencarian dan setiap nilai varchar(100) CAST ke varchar(max)

UPDATE ...WHERE varchar100column = @varcharmaxvalue

Sunting:

Ada item Microsoft Connect terbuka mengenai masalah ini.

Dan itu mungkin layak untuk dimasukkan dalam pengaturan Ketat Erland Sommarkog (dan item Connect yang cocok).

Sunting 2, setelah komentar Martins:

DECLARE @sql VARCHAR(MAX), @nsql nVARCHAR(MAX);
SELECT @sql = 'B', @nsql = 'B'; 
SELECT 
   LEN(@sql), 
   LEN(@nsql), 
   DATALENGTH(@sql), 
   DATALENGTH(@nsql)
;

DECLARE @t table(c varchar(8000));
INSERT INTO @t values (replicate('A', 7500));

SELECT LEN(c) from @t;
SELECT 
   LEN(@sql + c), 
   LEN(@nsql + c), 
   DATALENGTH(@sql + c), 
   DATALENGTH(@nsql + c) 
FROM @t;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Temukan Tipe Data Kolom yang Dikembalikan dalam Kumpulan Hasil di SQL Server

  2. Kolom Jarang di SQL Server:Dampak pada Waktu &Ruang

  3. Cara Mengembalikan Semua Batasan Kunci Asing yang Tidak Tepercaya di SQL Server (Contoh T-SQL)

  4. SQL Server, Bagaimana cara mengatur kenaikan otomatis setelah membuat tabel tanpa kehilangan data?

  5. Kolom IDENTITAS SQLServer dengan teks