มีค่าที่ฉันสามารถใช้ใน SELECT TOP ที่จะส่งคืนแถวทั้งหมดหรือไม่


13

ฉันอนุญาตให้ผู้ใช้กำหนดจำนวนแถวที่ส่งคืนโดยแบบสอบถาม (SELECT TOP (@x)) มีค่าที่สามารถป้อนที่ส่งคืนแถวทั้งหมดหรือไม่ หรือฉันต้องสร้างคิวรีแบบไดนามิกโดยไม่มี TOP (@x) หากต้องการให้ส่งคืนแถวทั้งหมดหรือไม่

ฉันใช้ SQL Server 2012


มันเป็นTOP ... ORDER BYอะไร เป็นORDER BYสิ่งที่จำเป็นในกรณีที่คุณเลือกทั้งหมดหรือไม่?
Martin Smith

1
ฉันเดาว่าเอ่อ ... ไม่สนใจTOPคำถาม เหมือนที่คุณกำลังติดต่อกับบางแบบสอบถามที่กำหนดไว้ล่วงหน้าและคุณต้องผ่านมันมีอะไรบางอย่าง ?
corsiKa

คำตอบ:


17

ดีก็ดูเหมือนTOPเป็นBIGINTถ้าคุณไม่ได้ใช้อัตราร้อยละ นั่นหมายความว่าคุณสามารถผ่านในมูลค่าสูงสุดBIGINT ,

SELECT TOP (9223372036854775807) * FROM table1

ฉันสงสัยอย่างจริงจังว่าคุณจะเห็นโต๊ะตัวใหญ่ ฉันไม่แน่ใจว่าชนิดของผลกระทบที่จะมีต่อแผนแบบสอบถาม


7
สมมติว่าตัวแปร@xเป็น BIGINT จากนั้นSET @x = 0x7fffffffffffffffอาจชัดเจนกว่าสำหรับบางคน จำได้ง่ายกว่าอยู่ดี
Martin Smith

@ มาร์ตินฉันจะซื่อสัตย์ฉันจะค้นหามันด้วยวิธีใด :) ฉันไม่เคยเห็นแบบนั้นทำมาก่อน นั่นคือการแปลงโดยนัย?
Kenneth Fisher

7
ง่ายต่อการจดจำถ้าคุณจำเริ่มต้น7แล้วส่วนที่เหลือคือFและคุณต้องการ 16 อักขระรวม 8 ไบต์ และใช่มันจะถูกแปลงโดยปริยายหากกำหนดให้กับตัวแปรของประเภทข้อมูลนั้น
Martin Smith

@MartinSmith มันเป็นวิธีที่ดีที่จะพึ่งพาการแสดงไบนารีของค่าหรือไม่ เอกสารระบุฐานเป็นตัวแทนของค่าอาจมีการเปลี่ยนแปลงจากรุ่นกับรุ่นของ SQL Server นอกจากนี้ฉันไม่ทราบว่าฉันเป็นเพียงคนเดียวที่สับสนอยู่เสมอโดยการ0x7fffffffffffffffแสดงค่าสูงสุดของbigintใน SqlServer เหตุผลก็คือในสัญกรณ์ SqlServer ไบนารีคงที่คุณมี7fในไบต์ที่ต่ำที่สุดซึ่งในภาษาเช่น c ++ คุณมีมันในไบต์สูงสุดที่จะได้รับประเภทหนึ่งที่ลงนามสูงสุด
i-one

3
@ I-หนึ่ง การเป็นตัวแทนไบนารีของประเภทจำนวนเต็มไม่น่าจะมีการเปลี่ยนแปลงอย่างมาก จะไม่มีประเด็นใน SQL Server ที่จัดหาตัวดำเนินการ bitwise ที่ทำงานกับชนิดจำนวนเต็มถ้าไม่คาดว่าเราสามารถพึ่งพารูปแบบเฉพาะได้
Martin Smith

12

คุณสามารถพิจารณา

SET ROWCOUNT @x;

SELECT Foo
FROM Bar
ORDER BY Baz;

แทน

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

ค่าที่คุณจะต้องตั้ง @x เป็นคือ0ปิดการใช้งาน

นี้เลิกใช้งบแก้ไขข้อมูล SELECTแต่ไม่เลิก

ในปี 2012 มีการรวบรวมแผนอื่นสำหรับกรณีที่ROWCOUNTเป็น 0 เทียบกับค่าที่ไม่ใช่ศูนย์

หากORDER BY Bazมีเพียงเพื่อให้ความหมายTOPมากกว่าเพื่อให้คำสั่งงานนำเสนอสำหรับผลลัพธ์และคุณไม่มีดัชนีที่สนับสนุนสิ่งนี้แล้วการแยกออกเป็นสองแบบสอบถามจะหลีกเลี่ยงการเรียงลำดับที่ไม่จำเป็นใน0กรณี


8

SELECT TOP 100 PERCENT สามารถใช้เพื่อข้ามข้อผิดพลาดใด ๆ ด้วยการใช้ "TOP" ในแบบสอบถาม


1
สำหรับฉันแล้วนั่นไม่ได้อธิบายถึงเหตุผลที่ใช้คุณลักษณะที่ปรับให้เหมาะสม Crystal Reports คาดว่า ORDER BY จะอยู่ในคำจำกัดความของมุมมองหรือไม่?
Andriy M

ไม่รายงาน Crystal มีปัญหาเกี่ยวกับการสอบถามและบังคับใช้แผนการดำเนินการของตนเองซึ่งทำให้ไม่มีประสิทธิภาพและบางครั้งไม่ถูกต้อง ฉันชอบทำทุกอย่างด้วยตรรกะและการออกแบบของฉันในแบบสอบถาม SQL และทำให้มัน "สวย" ใน Crystal นี่คือสาเหตุที่ฉันมีการโยกย้ายไปยัง SSIS / SSRS เป็นส่วนใหญ่ แต่ก็ยังมีรายงานแบบดั้งเดิมอยู่
MguerraTorres

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

1
คำถามคือเกี่ยวกับparametrisingข้อท็อป OP มีพารามิเตอร์ ( @x) อยู่ที่นั่นและพวกเขากำลังขอให้ค่าที่จะส่งผ่านไป@xเพื่อให้มันหมายถึง "ทุกแถว" โดยไม่คำนึงถึงจำนวนแถวที่ตารางมีอยู่จริง บางทีคุณสามารถหาวิธีปรับแก้ปัญหาให้ตรงกับความต้องการของ OP
Andriy M

1
ฉันได้ทำการปรับให้เหมาะสมกับคำถามแม้ว่าตามที่เขียนไว้นี้มีเงื่อนไขการแข่งขันหากมีการแทรกแถวพร้อมกัน สิ่งนี้จะต้องมีการล็อคตารางสำหรับช่วงเวลาเพื่อแก้ไขบล็อกที่แทรกเกิดขึ้นพร้อมกัน สิ่งนี้และค่าใช้จ่ายเพิ่มเติมในการตรวจสอบในสถานที่แรกสามารถหลีกเลี่ยงได้โดยใช้เพียงจำนวนมาก
Martin Smith

(SELECT COUNT(*) FROM YourTable)ไม่ใช่ค่า
ypercubeᵀᴹ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.