2012-01-13 11 views
11

Esiste un modo per rendere SQL Server Management Studio il ritorno delle righe in ordine decrescente per impostazione predefinita? Ogni volta che apro una tabella tramite il menu (ad esempio selezionando tutte le righe di restituzione), ottengo le righe più vecchie in alto. So che posso aggiungere 'ordine dal desc' nell'istruzione SQL, ma battitura che sta ottenendo fastidioso :)Ordina per desc come opzione predefinita per SQL Server Management Studio?

risposta

3

Non è possibile modificare il modello esistente per la generazione di SELECT dal menu di scelta rapida in SSMS.

Per fortuna, SSMS è estensibile. Ciò significa che è possibile scrivere le proprie estensioni che possono fare esattamente ciò che si desidera, oppure è possibile utilizzare una soluzione esistente. Vorrei raccomandare SSMS Tools di Mladen pack:

http://www.ssmstoolspack.com/

era gratis fino a poco tempo, e lo è ancora per le versioni precedenti e 2008R2.

12

Non v'è alcun ordinamento predefinito in SQL

Se state vedendo "più vecchia", a in cima a quello che potrebbe essere il modo più veloce per il motore di recuperarlo perché è così che viene memorizzato su disco.

Non è garantito per ottenere in questo ordine, considerarlo "non ordinato" a meno che non si specifica un ordine!

ORDER BY è l'unico modo per ottenere risultati in un ordine specifico.

L'ordine può essere un'operazione dispendiosa in base alla tabella e all'ordine specificato, quindi la norma non è ordinata.

+0

Capisco cosa stai dicendo, ma mi stavo chiedendo se ci fosse qualche impostazione in Gestione SQL Server Studio. Facendo clic con il tasto destro su un tavolo si ottiene l'opzione per recuperare 'top (x)' e speravo in qualche impostazione 'order desc' –

+0

@MartindeWildt Quella 'TOP X' è solo per limitare il set di risultati. Puoi certamente aggiungere un 'ORDER BY'. In circostanze normali, se non ci sono join, i risultati restituiti saranno probabilmente in ordine di chiave indice cluster. – JNK

+0

Penso che un titolo migliore per questa domanda potrebbe essere "C'è un modo per modificare la query SELECT predefinita in SQL Server Management Studio"? –

6

Ciò che JNK dice è corretto al 100%.

Ma se si vuole solo che normalmente lavoro, e solo quando si apre una tabella piuttosto che quando si esegue una query una tabella ...

Prova ad aggiungere un indice cluster, con il primo campo indicizzato che viene indicizzato in ordine decrescente. Questo sarà probabile che lo causi effettivamente ciò di cui hai bisogno.

(Se si dispone già di un indice cluster su quel campo, modificare le sue proprietà e cambiare la sua ordinazione.)


questa è solo un'idea sensata se tale indice è amichevole per l'uso effettivo di la tavola. Sarebbe controproducente per avere un indice che è inutile programmaticamente, solo per comodità;)

+1

+1 per fornire una soluzione alternativa a ciò che probabilmente vuole (invece di dirgli che ha torto come ho fatto :)) – JNK

+0

Non sarebbe terribile per le prestazioni degli inserti se si raggruppano in una colonna Identity? – UnhandledExcepSean

+1

@SpectralGhost Sì, penso che questo potrebbe causare problemi di frammentazione logica. Le nuove estensioni allocate probabilmente si troveranno nei numeri di pagina successivi nel file quando logicamente avrebbero bisogno di essere precedenti nel file. –

2

Citato da Microsoft SQL Server 2012 T-SQL Fundamentals di Itzik Ben-Gan -> Capitolo 1 -> background teorico -> teoria degli insiemi:

. .. quando si scrivono query T-SQL su tabelle nel database (come una tabella di dipendenti), si dovrebbe pensare all'insieme dei dipendenti nel loro insieme piuttosto che ai singoli dipendenti. ... In altre parole, una query su una tabella può restituire righe di tabella in qualsiasi ordine, a meno che non si richieda espressamente che i dati vengano ordinati in modo specifico, forse a scopo di presentazione.

SSMS non supporta l'istruzione SELECT predefinita personalizzata.Se supporta, quale colonna deve inserire dopo la clausola ORDER BY, Considerando le tabelle

  1. non hanno una colonna come "CreatedDate";
  2. o la cui chiave primaria è GUID (ordine non è ovvio)
  3. o non hanno una chiave primaria o indice cluster

server anche SQL sarà in grado di elencare i dati più recenti, un giorno, non è un modo naturale per pensare alle singole righe (più recenti/più vecchie) rispetto alle tabelle. Prova ad utilizzare l'istruzione UPDATE combinata con la clausola ORDER BY per aggiornare i dati più recenti.

2

Osservando l'uscita del Profiler, sembra che la query viene generato al volo in modo da non mettere le mie speranze su qualche modello è possibile modificare qualche parte

/****** Script for SelectTopNRows command from SSMS ******/ 
SELECT TOP 1000 [field1] 
     ,[field2] 
     ,[field3] 
     ,[last_modified] 
    FROM [test_database].[dbo].[t_test] 

In alternativa è possibile creare un piccola stored procedure che prende il nome di una tabella e restituisce i dati da tale tabella. Supponendo che nelle tue tabelle sia presente una logica (ricorrente) che indicherebbe l '"età" dei record, non dovrebbe essere troppo difficile determinare un ordine predefinito per tale tabella. Se si collega quindi questa procedura memorizzata a un tasto di scelta rapida, è possibile ottenere facilmente i primi n record da tale tabella nell'ordine desiderato. So che non è proprio come avere le informazioni nell'Object Explorer ma personalmente non utilizzo mai l'Object Explorer e preferisco piuttosto ottenere il contenuto di una tabella semplicemente selezionando il testo in una finestra di query e premendo CTRL-3.

per iniziare, sarebbe simile a questa

IF OBJECT_ID('p_select_top_100_desc') IS NOT NULL DROP PROCEDURE p_select_top_100_desc 
GO 
CREATE PROCEDURE p_select_top_100_desc (@table_name sysname) 
AS 

DECLARE @object_id int 
DECLARE @order_by_col nvarchar(max) 
DECLARE @sql nvarchar(max) 

SELECT @object_id = Object_id(@table_name), 
     @order_by_col = '' 

IF @object_id IS NULL 
    BEGIN 
     RaisError('Could not find table %s ?!', 16, 1, @table_name) 
     Return(-1) 
    END 

-- find order by column 
SELECT TOP 1 @order_by_col = c.name 
    FROM sys.columns c 
WHERE c.object_id = @object_id 
    AND lower(c.name) in ('modified', 'last_modified', 'change_date', 'crdate', 'etc') 

-- if none found, use the identity column 
SELECT @order_by_col = c.name + ' DESC' 
    FROM sys.columns c 
WHERE c.object_id = @object_id 
    AND c.is_identity = 1 
    AND @order_by_col = '' 

-- if still none found, use the PK (reverse order)   
SELECT @order_by_col = @order_by_col 
     + (CASE WHEN ic.index_column_id = 1 THEN '' ELSE ',' END) 
     + c.name 
     + (CASE WHEN ic.is_descending_key = 0 THEN ' DESC' ELSE ' ASC' END) 
    FROM sys.indexes i 
    JOIN sys.index_columns ic 
    ON ic.object_id = i.object_id 
    AND ic.index_id = i.index_id 
    JOIN sys.columns c 
    ON c.object_id = ic.object_id 
    AND c.column_id = ic.column_id 
WHERE i.object_id = @object_id 
    AND i.is_primary_key = 1 
    AND @order_by_col = '' 
ORDER BY ic.index_column_id 

-- actual query 
SELECT @sql = 'SELECT TOP 100 * FROM ' 
      + @table_name 
      + (CASE WHEN @order_by_col = '' THEN '' ELSE ' ORDER BY ' + @order_by_col END) 

PRINT @sql 
EXEC (@sql) 

Return 0 

GO 

EXEC p_select_top_100_desc 't_test' 

Per 'link' a un tasto di scelta rapida è necessario andare al menu Tools \ Customize, fare clic sul pulsante [Keyboard...]. Espandi il ramo Keyboard nell'albero e vai alla foglia Query Shortcuts. Si ottiene quindi una griglia fastidiosa che consente di collegare una stored procedure a una combinazione CTRL-nbr. Ricorda che alcuni di essi sono corretti + dopo averlo configurato e premuto OK l'impostazione funzionerà solo per le finestre di query che hai aperto di recente, quelle esistenti funzioneranno con la 'vecchia' configurazione.

Spero che questo aiuti un po '...

PS: se è il nome sp_select_top_n_desc e compilarlo nel database master si dovrebbe essere in grado di usarlo in tutto il server senza la necessità di implementare in ogni database . Tuttavia, probabilmente sarà necessario passare a dynamic-sql, quindi fare un prefisso a tutte le query sys.table con l'output di DB_Name() poiché altrimenti probabilmente verrà visualizzato nella tabella master.sys.columns ecc.che non è quello che volete =)

2

Prova a creare una vista su quel tavolo come questo e l'uso che nella clausola o ad hoc query di selezione

CREATE VIEW dbo.yourTable_vw 
AS 
    SELECT TOP 100 PERCENT * 
    FROM yourTable 
    ORDER BY yourcolumn DESC 
GO 
2

In realtà è possibile creare un componente aggiuntivo per SSMS che aggiunge una nuova elemento nel menu di scelta rapida di object explorer.

Controllare questa domanda: Create custom menu item in Object Explorer

Un altro modo è quello di creare un SP che genera ed esegue l'istruzione SELECT con la clausola ORDER BY nel master db (su tutti i server) e associare un tasto di scelta rapida a quella sp.

0

Anche se ufficialmente non esiste un ordinamento predefinito per l'input lineare semplice, sto ottenendo un soddisfacente ordine di ordinamento DESC con ordinamento PK o IX. Diciamo per le tabelle di registro dove sono più interessato per le ultime voci.

CREATE TABLE [dbo].[tableA]([DateTime] [datetime] NOT NULL, 
CONSTRAINT [PK_tableA] 
PRIMARY KEY CLUSTERED ([DateTime] DESC) 
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] 

O in SSMS ...

enter image description here

0

per me - io uso Codice EF prima, ma fare questo ogni volta che creo una nuova tabella: destro tavolo click, Ping Script come - > Rilasciare & Crea tabella e Modifica l'SQL e cambiare la chiave in DESC, quindi eseguire lo script .. terminato (nessuna visualizzazione o nulla di disordinato)

Problemi correlati