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
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:
era gratis fino a poco tempo, e lo è ancora per le versioni precedenti e 2008R2.
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.
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 per fornire una soluzione alternativa a ciò che probabilmente vuole (invece di dirgli che ha torto come ho fatto :)) – JNK
Non sarebbe terribile per le prestazioni degli inserti se si raggruppano in una colonna Identity? – UnhandledExcepSean
@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. –
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
- non hanno una colonna come "CreatedDate";
- o la cui chiave primaria è GUID (ordine non è ovvio)
- 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.
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 =)
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
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.
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 ...
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)
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' –
@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
Penso che un titolo migliore per questa domanda potrebbe essere "C'è un modo per modificare la query SELECT predefinita in SQL Server Management Studio"? –