"Pemotongan NVARCHAR(MAX) Masih Berlaku: Memahami Penukaran Tersirat"
Walaupun terdapat tanggapan salah bahawa NVARCHAR(MAX) dalam versi SQL Server moden memegang data yang besar, pengguna mungkin menghadapi pemotongan kepada 4000 aksara seperti dalam ini contoh:
DECLARE @Query NVARCHAR(max); SET @Query = 'SELECT...' -- some of the query gets set here SET @Query = @Query + '...' -- more query gets added on, etc. -- later on... PRINT LEN(@Query) -- Prints out 4273, which is correct as far as I can tell PRINT @Query -- Truncates value to 4000 characters EXEC sp_executesql @Query -- totally crashes due to malformed (truncated) query
Punca Punca: Penukaran Tersirat
Isu ini berpunca daripada penukaran tersirat. Apabila menggabungkan rentetan dengan aksara Unicode, SQL Server secara automatik menukar keputusan kepada NVARCHAR(4000) tanpa amaran atau tanda pemotongan. Ini berlaku walaupun apabila pembolehubah yang diisytiharkan untuk menyimpan hasilnya ialah NVARCHAR(MAX).
Penyelesaian: Menguatkuasakan Penukaran Eksplisit
Untuk mengelakkan penukaran tersirat dan memastikan pengekalan besar data, sentiasa pra-gabungkan menggunakan CAST:
SET @Query = CAST('' as nVarChar(MAX)) -- Force implicit conversion to nVarChar(MAX) + 'SELECT...' -- some of the query gets set here + '...' -- more query gets added on, etc.
Dengan menghantar rentetan kosong ke NVARCHAR(MAX), SQL Server secara eksplisit diarahkan untuk mengendalikan keseluruhan rentetan sebagai NVARCHAR(MAX). Ini menghapuskan isu pemangkasan.
Pertimbangan Lain
Atas ialah kandungan terperinci Mengapa NVARCHAR(MAX) Masih Memotong Rentetan Saya dalam Pelayan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!