Tidak ada batasan kode keras yang relevan (65.536 * Ukuran Paket Jaringan 4KB adalah 268 MB dan panjang skrip Anda tidak jauh dari itu) meskipun tidak disarankan untuk menggunakan metode ini untuk jumlah baris yang besar.
Kesalahan yang Anda lihat dilemparkan oleh alat klien bukan SQL Server. Jika Anda membuat SQL String dalam kompilasi SQL dinamis setidaknya dapat dimulai dengan sukses
DECLARE @SQL NVARCHAR(MAX) = '(100,200,300),
';
SELECT @SQL = 'SELECT * FROM (VALUES ' + REPLICATE(@SQL, 1000000) + '
(100,200,300)) tc (proj_d, period_sid, val)';
SELECT @SQL AS [processing-instruction(x)]
FOR XML PATH('')
SELECT DATALENGTH(@SQL) / 1048576.0 AS [Length in MB] --30.517705917
EXEC(@SQL);
Meskipun saya membunuh yang di atas setelah ~ 30 menit waktu kompilasi dan masih belum menghasilkan baris. Nilai literal perlu disimpan di dalam paket itu sendiri sebagai tabel konstanta dan SQL Server menghabiskan banyak waktu mencoba untuk mendapatkan properti tentang mereka juga.
SSMS adalah aplikasi 32 bit dan menampilkan std::bad_alloc
pengecualian saat mem-parsing batch
Ini mencoba untuk mendorong elemen ke vektor Token yang telah mencapai kapasitas dan upayanya untuk mengubah ukuran gagal karena tidak tersedianya area memori yang cukup besar. Jadi pernyataan itu bahkan tidak pernah sampai sejauh server.
Kapasitas vektor bertambah 50% setiap kali (yaitu mengikuti urutan di sini ). Kapasitas yang dibutuhkan vektor untuk berkembang bergantung pada bagaimana kode diletakkan.
Yang berikut ini perlu berkembang dari kapasitas 19 menjadi 28.
SELECT * FROM (VALUES (100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300)) tc (proj_d, period_sid, val)
dan berikut ini hanya membutuhkan ukuran 2
SELECT * FROM (VALUES (100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300),(100,200,300)) tc (proj_d, period_sid, val)
Berikut ini membutuhkan kapasitas> 63 dan <=94.
SELECT *
FROM (VALUES
(100,
200,
300),
(100,
200,
300),
(100,
200,
300),
(100,
200,
300),
(100,
200,
300),
(100,
200,
300)
) tc (proj_d, period_sid, val)
Untuk satu juta baris yang ditata seperti pada kasus 1, kapasitas vektor perlu ditingkatkan menjadi 3.543.306.
Anda mungkin menemukan bahwa salah satu dari berikut ini akan memungkinkan penguraian sisi klien berhasil.
- Kurangi jumlah jeda baris.
- Memulai ulang SSMS dengan harapan permintaan untuk memori besar yang berdekatan berhasil jika fragmentasi ruang alamat lebih sedikit.
Namun bahkan jika Anda berhasil mengirimnya ke server, itu hanya akan berakhir dengan mematikan server selama pembuatan rencana eksekusi seperti yang dibahas di atas.
Anda akan jauh lebih baik menggunakan panduan ekspor impor untuk memuat tabel. Jika Anda harus melakukannya di TSQL, Anda akan menemukan bahwa memecahnya menjadi kumpulan yang lebih kecil dan/atau menggunakan metode lain seperti merobek-robek XML akan berkinerja lebih baik daripada Konstruktor Bernilai Tabel. Contoh berikut dijalankan dalam 13 detik di komputer saya (meskipun jika menggunakan SSMS, Anda mungkin masih harus memecah menjadi beberapa kelompok daripada menempelkan string XML literal yang besar).
DECLARE @S NVARCHAR(MAX) = '<x proj_d="100" period_sid="200" val="300" />
' ;
DECLARE @Xml XML = REPLICATE(@S,1000000);
SELECT
x.value('@proj_d','int'),
x.value('@period_sid','int'),
x.value('@val','int')
FROM @Xml.nodes('/x') c(x)