Esiste un valore che posso utilizzare in SELECT TOP che restituirà tutte le righe?


13

Sto permettendo all'utente finale di definire quante righe vengono restituite da una query (SELECT TOP (@x)). Esiste un valore che può essere inserito dove vengono restituite tutte le righe? O devo creare dinamicamente la query senza TOP (@x) se vogliono che vengano restituite tutte le righe?

Sto usando SQL Server 2012.


È TOP ... ORDER BYqualcosa? È la ORDER BYcosa ancora necessaria nel caso in cui si seleziona tutto?
Martin Smith,

1
Immagino che ... omettere il fatto TOPsia fuori discussione? Come se hai a che fare con una query predefinita e devi passarla qualcosa ?
corsiKa

Risposte:


17

Bene, sembra che TOP sia un GRANDE se non stai usando un PERCENTO . Ciò significa che potresti passare il valore massimo di BIGINT ,

SELECT TOP (9223372036854775807) * FROM table1

Dubito seriamente che vedrai mai un tavolo così grande. Non sono sicuro del tipo di effetto che avrebbe sul piano di query.


7
Supponendo che la variabile @xsia BIGINT, SET @x = 0x7fffffffffffffffpotrebbe essere più chiara per alcuni. È più facile da ricordare comunque.
Martin Smith,

@MartinSmith Sarò onesto, lo cercherò in entrambi i modi :) Ma non l'ho mai visto prima. È una conversione implicita?
Kenneth Fisher,

7
Beh, è ​​più facile da ricordare se ti ricordi solo di iniziare 7e poi il resto lo è Fe hai bisogno di 16 caratteri in totale per gli 8 byte. E sì, verrà convertito implicitamente se si assegna a una variabile di quel tipo di dati.
Martin Smith,

@MartinSmith È buona norma fare affidamento sulla rappresentazione binaria del valore? Gli stati della documentazione La rappresentazione binaria di un valore potrebbe cambiare da versione a versione di SQL Server . Inoltre, non so se sono l'unica persona, sempre confusa dalla 0x7fffffffffffffffrappresentazione del valore massimo di bigintin SqlServer. Il motivo è che nella notazione costante binaria SqlServer hai 7fil byte più basso , dove come in linguaggi come c ++ lo hai nel byte più alto per ottenere il massimo del tipo integrale con segno.
i-one,

3
@ i-one. È estremamente improbabile che la rappresentazione binaria dei tipi di numeri interi cambi. Inutile che SQL Server fornisca operatori bit a bit che operano sui tipi interi se non ci si aspettava che potessimo contare su un formato specifico.
Martin Smith,

12

Potresti anche considerare

SET ROWCOUNT @x;

SELECT Foo
FROM Bar
ORDER BY Baz;

Invece di

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

Il valore che dovresti impostare su @x è 0disabilitarlo.

Questo è deprecato per le dichiarazioni di modifica dei dati ma non è deprecato per SELECT.

Nel 2012 viene compilato un piano diverso per il caso ROWCOUNTcompreso tra 0 e un valore diverso da zero.

Se il ORDER BY Bazsolo è lì per dare un significato al TOPpiuttosto che fornire un ordine di presentazione per i risultati e non si dispone di un indice che supporti questo, la suddivisione in due query eviterebbe un ordinamento non necessario nel 0caso.


8

SELEZIONARE TOP 100 PERCENT può essere utilizzato per bypassare eventuali errori con l'utilizzo di "TOP" in una query.


1
Per me, questo non spiega davvero il motivo per utilizzare una funzione che viene ottimizzata. Crystal Reports prevede che un ORDER BY sia presente nella definizione della vista?
Andriy M,

No, Crystal Reports ha problemi con l'acquisizione di query e la forzatura dei propri piani di esecuzione, rendendoli molto inefficienti e talvolta imprecisi. Preferisco fare TUTTA la mia logica e il design nella query SQL, e semplicemente renderlo "carino" in Crystal. Questo è il motivo per cui ho migrato, per la maggior parte, su SSIS / SSRS, ma ci sono ancora rapporti legacy là fuori.
MguerraTorres,

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

1
La domanda riguarda la parametrizzazione della clausola TOP. L'OP ha già un parametro ( @x) lì, e ora stanno chiedendo a quale valore passare in @xmodo che significhi "tutte le righe" indipendentemente da quante righe ha effettivamente la tabella. Forse potresti scoprire come adattare la tua soluzione ai requisiti del PO.
Andriy M,

1
Ho apportato le modifiche necessarie per rispondere alla domanda, anche se, come scritto, questo ha una condizione di competizione se le righe vengono inserite contemporaneamente. Ciò richiederebbe un blocco della tabella per la durata per risolvere che blocca inserimenti simultanei. Questo e le spese extra per il controllo in primo luogo possono essere evitate semplicemente usando un numero elevato.
Martin Smith,

(SELECT COUNT(*) FROM YourTable)non è un valore.
ypercubeᵀᴹ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.