Упорядочить по desc как вариант по умолчанию для SQL Server Management Studio? - PullRequest
13 голосов
/ 13 января 2012

Есть ли способ заставить SQL Server Management Studio возвращать строки по убыванию по умолчанию? Каждый раз, когда я открываю таблицу через меню (например, выбирая возвращать все строки), я получаю самые старые строки вверху. Я знаю, что могу добавить 'order by desc' в операторе sql, но набирать текст становится раздражающим:)

Ответы [ 9 ]

12 голосов
/ 13 января 2012

В SQL нет порядка сортировки по умолчанию

Если вы видите «самый старый» сверху, то это может быть самый быстрый способ для движка извлечь его, потому что именно так он хранится на диске.

Вам не гарантировано получить его в этом порядке, считайте его «неупорядоченным», если вы не указали заказ!

ORDER BY - единственный способ получить результаты в определенном порядке.

Заказ может быть дорогостоящей операцией в зависимости от таблицы и указанного заказа, поэтому неупорядоченный является нормой.

6 голосов
/ 13 января 2012

То, что говорит JNK, на 100% правильно.

Но если вы просто хотите, чтобы нормально работали, и только при открытии таблицы, а не при запросе таблица ...

Попробуйте добавить кластеризованный индекс, при этом первое индексированное поле будет проиндексировано в порядке убывания. Это вероятно на самом деле приведет к тому, что вам нужно.

(Если у вас уже есть кластеризованный индекс в этом поле, измените его свойства и измените его порядок.)


Это разумная идея, только если такой индекс соответствует фактическому использованию таблицы. Было бы самоубийством иметь индекс, который бесполезен для программирования, просто для вашего удобства;)

3 голосов
/ 13 апреля 2014

Вы не можете изменить существующий шаблон для генерации SELECT из контекстного меню в SSMS.

К счастью, SSMS является расширяемой. Это означает, что вы можете написать свои собственные расширения, которые могут делать именно то, что вы хотите, или вы можете использовать какое-то существующее решение. Я бы порекомендовал Mladen's SSMS Tools Pack:

http://www.ssmstoolspack.com/

До недавнего времени она была бесплатной и до сих пор предназначена для версий 2008r2 и более ранних.

2 голосов
/ 17 апреля 2014

На самом деле вы можете создать надстройку для ssms, которая добавляет новый элемент в контекстное меню проводника объектов.

Проверьте этот вопрос: Создать пользовательский пункт меню в Обозревателе объектов

Другой способ - создать SP, который генерирует и выполняет оператор select с предложением ORDER BY в главной базе данных (на всех серверах) и привязывает сочетание клавиш к этому sp.

2 голосов
/ 15 апреля 2014

Попробуйте создать представление для этой таблицы, как показано ниже, и используйте его в предложении select или в специальном запросе

CREATE VIEW dbo.yourTable_vw
AS 
    SELECT TOP 100 PERCENT *
    FROM yourTable
    ORDER BY yourcolumn DESC
GO
2 голосов
/ 15 апреля 2014

Глядя на вывод Профилировщика, кажется, что запрос генерируется на лету, поэтому я бы не стал надеяться на какой-то шаблон, который вы можете где-то изменить

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

В качестве альтернативы вы можете создать небольшую хранимую процедуру, которая берет имя таблицы и затем возвращает данные из этой таблицы. Предполагая, что в ваших таблицах есть (повторяющаяся) логика, которая будет указывать «возраст» записей, не составит труда определить порядок по умолчанию для этой таблицы. Если вы затем связываете эту хранимую процедуру с горячей клавишей, вы можете легко получить первые n записей из указанной таблицы в нужном вам порядке. Я знаю, что это не совсем то же самое, что иметь информацию в обозревателе объектов, но лично я никогда не использую обозреватель объектов, и мне нравится получать содержимое таблицы, просто выделяя текст в окне запроса и нажимая CTRL-3.

Для начала, это будет выглядеть примерно так

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'

Чтобы связать его с горячей клавишей, вам нужно перейти в меню Tools \ Customize, нажмите кнопку [Keyboard...]. Разверните ветку Keyboard в дереве и перейдите к листу Query Shortcuts. Затем вы получаете раздражающую сетку, которая позволяет связать хранимую процедуру с комбинацией CTRL-nbr. Помните, что некоторые из них исправлены + после того, как вы настроите его и нажмете ОК, настройка будет работать только для вновь открываемых окон запросов, существующие будут работать со «старой» конфигурацией.

Надеюсь, это немного поможет ...

PS: если вы назовете его sp_select_top_n_desc и скомпилируете в основной базе данных, вы сможете использовать его на всем сервере без необходимости развертывать его в каждой базе данных. Тем не менее, вам, вероятно, потребуется переключиться на dynamic-sql, а затем использовать префикс всех sys.table запросов с выводом DB_Name(), так как в противном случае он, вероятно, будет выглядеть в таблице master.sys.columns и т. Д., А это не то, что вы хочу =)

2 голосов
/ 13 апреля 2014

Цитируется из Ицик Бен-Гана Microsoft SQL Server 2012 Основы T-SQL -> Глава 1 -> Теоретические основы -> Теория множеств:

... когда выписать запросы T-SQL к таблицам в базе данных (например, к таблице сотрудников), вы должны думать о совокупности сотрудников в целом, а не об отдельных сотрудниках.... Другими словами, запрос к таблице может возвращать строки таблицы в любом порядке, если только вы явно не запросите, чтобы данные были отсортированы определенным образом, возможно, для целей представления.

SSMS неподдержка настроенного по умолчанию оператора SELECT.Если он поддерживает, какой столбец следует поместить после предложения ORDER BY, учитывая, что в таблицах

  1. нет столбца, подобного CreatedDate;
  2. или первичный ключ которого GUID (порядок неочевиден)
  3. или не имеет первичного ключа или кластерного индекса

Даже SQL SERVER когда-нибудь сможет перечислять самые новые данные, это не естественный способдумайте отдельные строки (самые новые / самые старые) против таблиц.Попробуйте использовать инструкцию UPDATE в сочетании с предложением ORDER BY для обновления новейших данных.

1 голос
/ 08 мая 2017

Хотя официально для простого линейного ввода нет порядка сортировки по умолчанию, я получаю удовлетворительный порядок сортировки по умолчанию DESC с порядком сортировки PK или IX.Скажем, для журнальных таблиц, где меня больше всего интересуют последние записи.

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]

Или в SSMS ...

enter image description here

0 голосов
/ 24 мая 2017

для меня - сначала я использую EF Code, но делаю это всякий раз, когда создаю новую таблицу: Щелкните правой кнопкой мыши по таблице, выберите «Таблица сценариев как -> Удалить и создать таблицу» и «Редактировать SQL», измените ключ на DESC, затем запустите сценарий ... готово (без просмотра или чего-либо грязного)

...