Không có giới hạn mã hóa cứng có liên quan (65,536 * Kích thước gói mạng của 4KB là 268 MB và độ dài tập lệnh của bạn không bằng mức đó) mặc dù không thể sử dụng phương pháp này cho một lượng lớn hàng.
Lỗi bạn đang thấy là do các công cụ máy khách không phải SQL Server. Nếu bạn xây dựng Chuỗi SQL trong biên dịch SQL động thì ít nhất có thể bắt đầu thành công
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);
Mặc dù tôi đã giết phần trên sau thời gian biên dịch ~ 30 phút và nó vẫn chưa tạo ra một hàng. Các giá trị chữ cần được lưu trữ bên trong bản thân kế hoạch dưới dạng một bảng hằng số và SQL Server sử dụng rất nhiều thời gian cũng cố gắng lấy các thuộc tính về chúng.
SSMS là một ứng dụng 32 bit và ném một std::bad_alloc
ngoại lệ trong khi phân tích lô
Nó cố gắng đẩy một phần tử lên một vector Mã thông báo đã đạt đến dung lượng và nỗ lực thay đổi kích thước của nó không thành công do không có vùng bộ nhớ liền kề đủ lớn. Vì vậy, câu lệnh thậm chí không bao giờ đưa nó đến tận máy chủ.
Dung lượng vectơ tăng 50% mỗi lần (tức là tuân theo trình tự ở đây ). Dung lượng mà vectơ cần phát triển phụ thuộc vào cách mã được trình bày.
Những người sau cần phải phát triển từ công suất 19 lên 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)
và phần sau chỉ cần kích thước là 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)
Phần sau cần dung lượng> 63 và <=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)
Đối với một triệu hàng được bố trí như trong trường hợp 1, công suất vectơ cần tăng lên 3,543,306.
Bạn có thể thấy rằng một trong hai cách sau sẽ cho phép phân tích cú pháp phía máy khách thành công.
- Giảm số lượng ngắt dòng.
- Khởi động lại SSMS với hy vọng yêu cầu bộ nhớ liền kề lớn sẽ thành công khi có ít phân mảnh không gian địa chỉ hơn.
Tuy nhiên, ngay cả khi bạn gửi thành công nó đến máy chủ, nó sẽ chỉ kết thúc việc giết máy chủ trong quá trình tạo kế hoạch thực thi như đã thảo luận ở trên.
Bạn sẽ tốt hơn nhiều khi sử dụng trình hướng dẫn xuất nhập để tải bảng. Nếu bạn phải làm điều đó trong TSQL, bạn sẽ thấy việc chia nó thành các lô nhỏ hơn và / hoặc sử dụng một phương pháp khác chẳng hạn như cắt nhỏ XML sẽ hoạt động tốt hơn Trình tạo bảng có giá trị. Ví dụ:thực thi sau 13 giây trên máy của tôi (mặc dù nếu sử dụng SSMS, bạn vẫn có thể phải chia thành nhiều lô thay vì dán một chuỗi XML lớn theo nghĩa đen).
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)