Có một giá trị mà tôi có thể sử dụng trong CHỌN HÀNG ĐẦU sẽ trả về tất cả các hàng không?


13

Tôi đang cho phép người dùng cuối xác định có bao nhiêu hàng được trả về bởi một truy vấn (CHỌN HÀNG ĐẦU (@x)). Có một giá trị có thể được nhập vào nơi tất cả các hàng được trả về? Hoặc tôi phải tự động tạo truy vấn mà không có TOP (@x) nếu họ muốn tất cả các hàng được trả về?

Tôi đang sử dụng SQL Server 2012.


Có phải TOP ... ORDER BYcái gì không? Là ORDER BYmột cái gì đó vẫn cần thiết trong trường hợp bạn chọn tất cả?
Martin Smith

1
Tôi đoán uhhh ... chỉ cần bỏ qua TOPlà ra khỏi câu hỏi? Giống như bạn đang xử lý một số truy vấn được xác định trước và bạn phải vượt qua nó một cái gì đó ?
corsiKa

Câu trả lời:


17

Chà, có vẻ như TOP là một BIGINT nếu bạn không sử dụng PERCENT . Điều đó có nghĩa là bạn có thể vượt qua giá trị tối đa của BIGINT ,

SELECT TOP (9223372036854775807) * FROM table1

Tôi thực sự nghi ngờ bạn sẽ bao giờ nhìn thấy một cái bàn lớn như vậy. Tôi không chắc chắn loại hiệu ứng nào sẽ có trong kế hoạch truy vấn.


7
Giả sử biến @xlà BIGINT thì SET @x = 0x7fffffffffffffffcó thể rõ ràng hơn với một số người. Dù sao nó cũng dễ nhớ hơn.
Martin Smith

@MartinSmith Tôi sẽ thành thật Tôi sẽ tìm kiếm nó theo cách nào :) Tôi chưa bao giờ thấy điều đó được thực hiện trước đây. Đó có phải là một chuyển đổi ngầm?
Kenneth Fisher

7
Chà sẽ dễ nhớ hơn nếu bạn chỉ nhớ bắt đầu 7và sau đó là phần còn lại Fvà bạn cần tổng cộng 16 ký tự cho 8 byte. Và có, nó sẽ được chuyển đổi hoàn toàn nếu gán cho một biến của kiểu dữ liệu đó.
Martin Smith

@MartinSmith Có phải là một thực hành tốt để dựa vào biểu diễn nhị phân của giá trị? Các tài liệu khẳng định sự biểu diễn nhị phân của một giá trị có thể thay đổi từ phiên bản lên phiên bản của SQL Server . Ngoài ra, tôi không biết liệu tôi có phải là người duy nhất, người luôn bối rối khi 0x7fffffffffffffffđại diện cho giá trị tối đa của biginttrong SqlServer. Lý do là trong ký hiệu liên tục nhị phân SQLServer bạn có 7ftrong thấp nhất byte, nơi như trong các ngôn ngữ như C ++ bạn có nó trong cao nhất byte để có được tối đa của loại không thể thiếu ký.
i-một

3
@ tôi-một. Biểu diễn nhị phân của các loại số nguyên là rất khó thay đổi. Sẽ không có điểm nào trong SQL Server cung cấp các toán tử bit hoạt động trên các kiểu số nguyên nếu không mong muốn chúng ta có thể dựa vào một định dạng cụ thể.
Martin Smith

12

Bạn cũng có thể xem xét

SET ROWCOUNT @x;

SELECT Foo
FROM Bar
ORDER BY Baz;

Thay vì

SELECT TOP (@x) Foo
FROM Bar 
ORDER BY Baz;

Giá trị bạn cần đặt @x là 0tắt nó đi.

Điều này không được chấp nhận cho các báo cáo sửa đổi dữ liệu nhưng không được phản đối SELECT.

Trong năm 2012, một kế hoạch khác được biên soạn cho trường hợp ROWCOUNTlà 0 so với một số giá trị khác không.

Nếu ORDER BY Bazchỉ có ở đó để có ý nghĩa TOPthay vì cung cấp thứ tự trình bày cho kết quả và bạn không có một chỉ mục hỗ trợ điều này thì việc chia thành hai truy vấn sẽ tránh được một loại không cần thiết trong 0trường hợp.


8

CHỌN 100 PERCENT có thể được sử dụng để bỏ qua mọi lỗi khi sử dụng "TOP" trong truy vấn.


1
Đối với tôi, điều đó không thực sự giải thích lý do sử dụng một tính năng được tối ưu hóa. Crystal Báo cáo có mong đợi ĐẶT HÀNG B BYNG trong định nghĩa chế độ xem không?
Andriy M

Không, Crystal Báo cáo có vấn đề với việc giữ các truy vấn và buộc các kế hoạch thực hiện của riêng nó đối với chúng, khiến chúng rất không hiệu quả và đôi khi không chính xác. Tôi thích thực hiện TẤT CẢ logic và thiết kế của mình trong truy vấn SQL và chỉ cần làm cho nó "đẹp" trong Crystal. Đây là lý do tại sao tôi, phần lớn, đã di chuyển sang SSIS / SSRS, nhưng vẫn có những báo cáo kế thừa ngoài kia.
MguerraTorres

-2
select top(SELECT COUNT(*) FROM YourTable) * From YourTable

1
Câu hỏi là về tham số mệnh đề TOP. OP đã có một tham số ( @x) ở đó và bây giờ họ đang hỏi giá trị nào được chuyển đến @xđể nó có nghĩa là "tất cả các hàng" bất kể có bao nhiêu hàng mà bảng thực sự có. Có lẽ bạn có thể tìm ra cách điều chỉnh giải pháp của mình để phù hợp với yêu cầu của OP.
Andriy M

1
Tôi đã thực hiện các điều chỉnh để phù hợp với câu hỏi mặc dù như đã viết, điều này có điều kiện cuộc đua nếu các hàng được chèn đồng thời. Điều này sẽ yêu cầu khóa bảng trong thời gian để giải quyết các khối chèn đồng thời. Điều này và chi phí thêm của việc kiểm tra ở nơi đầu tiên có thể tránh được chỉ bằng cách sử dụng một số lượng lớn.
Martin Smith

(SELECT COUNT(*) FROM YourTable)không phải là một giá trị.
ypercubeᵀᴹ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.