2011-12-20 27 views
7

"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 cụm từ 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."SQL: Lỗi, giới hạn dịch vụ biểu đạt?

Có ai nhìn thấy điều này trước đây và tìm thấy cách giải quyết tốt không?

Tôi cố gắng giải quyết vấn đề này bằng cách tách truy vấn SQL thành hai phần cơ bản và viết truy vấn SQL chọn đầu tiên vào bảng tạm thời và phần thứ hai, câu lệnh chọn SQL mới chọn từ bảng tạm thời và sử dụng rất nhiều Toán tử CROSS APPLY để tính toán các cột được tính toán tầng.

Đây là một ví dụ về cách nhìn phần thứ hai nhưng tôi đang sử dụng rất nhiều chi tiết Chữ thập applys để sản xuất các cột mới mà là tính toán:

Select * from #tempTable   

cross apply 
    (
     select HmmLowestSalePrice = 
     round(((OurSellingPrice + 1.5)/0.95) - (CompetitorsLowestSalePrice) + 0.08, 2) 
    ) as HmmLowestSalePrice 

cross apply 
    (
     select checkLowestSP = 
     case 
     when adjust = 'No Room' then 'No Room' 
     when OrginalTestSalePrice >= CompetitorsLowestSalePrice then 'Minus' 
     when OrginalTeslSalePrice < CompetitorsLowestSalePrice then 'Ok' 
     end 
) as checkLowestSP 

cross apply 
    (
     select AdjustFinalNewTestSP = 
     case 
     when FinalNewTestShipping < 0 Then NewTestSalePrice - (FinalNewTestShipping) 
     when FinalNewTestShipping >= 0 Then NewTestSalePrice 
     end 
) as AdjustFinalNewTestSP 

cross apply 
    (
     select CheckFinalSalePriceWithWP = 
     case 
     when round(NewAdminSalePrice, 2) >= round(wholePrice, 2) then 'Ok' 

     when round(NewAdminSalePrice, 2) < round(wholePrice, 2) then 'Check' 
     end 
    ) as CheckFinalPriceWithWP 


DROP TABLE #tempTable 

Mục tiêu của tôi để đưa điều này vào một báo cáo sql và nó hoạt động tốt nếu chỉ có 1 người dùng là #tempTable sẽ được tạo và thả trong cùng một bản thực thi và kết quả được hiển thị trong báo cáo chính xác. Nhưng trong tương lai nếu có người dùng đồng thời, tôi lo ngại rằng họ sẽ viết cho cùng một #tempTable, điều này sẽ ảnh hưởng đến kết quả?

Tôi đã xem xét việc đưa quy trình này vào các thủ tục được lưu trữ nhưng vẫn nhận được thông báo lỗi ở trên.

+2

Tôi mơ về một thế giới mà chúng ta không cần phải hoàn toàn cấu trúc lại mã của chúng tôi để phù hợp với một, hạn chế cổ xưa tối nghĩa. Nếu bạn chia sẻ giấc mơ đó, vui lòng bỏ phiếu cho phản hồi Kết nối của tôi: https://connect.microsoft.com/SQLServer/feedback/details/789949/sql-increase-expression-services-limit-for-complex-nested-in-clauses –

Trả lời

6

Sự cố này xảy ra do SQL Server giới hạn số lượng số nhận dạng và hằng số có thể được chứa trong một biểu thức truy vấn. Giới hạn là 65.535. Việc kiểm tra số lượng số nhận dạng và hằng số được thực hiện sau khi SQL Server mở rộng tất cả các số nhận dạng và hằng số được tham chiếu. Trong SQL Server 2005 trở lên, các truy vấn được chuẩn hóa nội bộ và đơn giản hóa. Và điều đó bao gồm * (dấu hoa thị), cột được tính, v.v.

Để khắc phục sự cố này, hãy viết lại truy vấn của bạn. Tham chiếu ít số nhận dạng và hằng số trong biểu thức lớn nhất trong truy vấn. Bạn phải đảm bảo rằng số lượng số nhận dạng và hằng số trong mỗi biểu thức truy vấn không vượt quá giới hạn. Để thực hiện việc này, bạn có thể phải chia nhỏ truy vấn thành nhiều truy vấn. Sau đó, tạo kết quả trung gian tạm thời.

+1

Bạn vừa sao chép và dán trang này từ trang web mirosoft? Tôi đã đọc cùng một điều và tôi đã chia các kết quả thành một bảng tạm thời = trung gian resuly (và nhận nó làm việc) nhưng lo ngại rằng nếu tôi có một vài người dùng này sẽ không làm việc – Standage

+3

@Paul - Tôi không nghĩ rằng có nhiều người dùng sẽ gây ra bất kỳ sự cố nào. Hãy xem bài đăng này: http://stackoverflow.com/questions/4725812/temp-table-usuage-in-a-multi-user-environment – TheBoyan

+0

Ok chúc mừng cho câu trả lời! – Standage

1

Tôi vừa gặp sự cố này và khắc phục sự cố bằng cách xóa chỉ mục UNIQUE trên bảng của tôi. Đối với một số lý do, điều đó dường như kích hoạt lỗi này, mặc dù nó không thể hiểu tại sao.

Nhân tiện, cùng một truy vấn không hoạt động với một số chỉ mục khác.

1

gì làm việc đối với tôi là thay thế một vài COALESCE báo cáo với ISNULL bất cứ khi nào có thể là

Các vấn đề liên quan