Vấn đề của tôi (hoặc ít nhất là thông báo lỗi) rất giống với bộ xử lý truy vấn đã hết tài nguyên nội bộ - truy vấn sql cực dài .
Khách hàng của tôi đang làm việc với truy vấn chọn SQL, chứa mệnh đề where với chính xác 100.000 mục nhập.
Truy vấn không thành công với lỗi 8632 và thông báo lỗi
Lỗi nội bộ: Đã đạt đến giới hạn dịch vụ biểu thức. Vui lòng tìm các biểu thức có khả năng phức tạp trong truy vấn của bạn và cố gắng đơn giản hóa chúng.)
Tôi thấy rất đặc biệt khi thông báo lỗi này bị ném, chính xác là 100.000 mục, vì vậy tôi tự hỏi liệu đây có phải là một giá trị cấu hình không. Đây có phải là trường hợp và trong trường hợp có, làm thế nào tôi có thể tăng giá trị này lên cao hơn?
Trên MSDN , có đề xuất viết lại truy vấn, nhưng tôi muốn tránh điều này.
Trong khi đó, tôi phát hiện ra rằng danh sách các mục tôi đang nói có chứa số tự nhiên, khá nhiều trong số chúng dường như là tuần tự (đại loại như (1,2,3,6,7,8,9,10,12, 13,15,16,17,18,19,20).
Điều này làm cho mệnh đề SQL ở đâu đó như:
where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20)
Tôi có thể chuyển đổi nó thành:
where (entry between 1 and 3) OR
(entry between 6 and 10) OR
(entry between 12 and 13) OR
(entry between 15 and 20)
Điều này có thể được rút ngắn bằng cách:
where entry in (1,...,3,6,...,10,12,13,15,...,20)
... Hoặc một cái gì đó tương tự? (Tôi biết đó là một cú sút xa, nhưng nó sẽ giúp cập nhật phần mềm dễ dàng hơn và dễ đọc hơn)
Đối với thông tin của bạn: dữ liệu trong mệnh đề where là kết quả của phép tính, được thực hiện trên một bảng khác: đầu tiên các mục của bảng đó được đọc và lọc ở đầu, sau đó một số xử lý bổ sung được thực hiện (không thể thực hiện được bằng cách sử dụng SQL), kết quả của quá trình xử lý bổ sung đó là lọc nhiều hơn và kết quả của việc đó được sử dụng trong mệnh đề where. Vì không thể viết bộ lọc hoàn chỉnh trong SQL, phương thức được đề cập đã được sử dụng. Rõ ràng nội dung của mệnh đề where có thể thay đổi ở mỗi lần xử lý, do đó cần một giải pháp động.
WHERE IN
không hỗ trợ loại cú pháp phạm vi đó. Ngoài ra, nó không nênWHERE () OR () OR ()
VÀ. Nhưng để sử dụng đề xuất của Brent, bạn thực sự không phải thay đổi toàn bộ truy vấn, bạn chỉ có thể làmWHERE IN (SELECT myID FROM #biglist)
. Và#biglist
có thể là một bảng thực sự (vĩnh viễn) hoặc một bảng tạm thời bạn thực hiện khi đang bay.