Есть ли способ заставить SQL Server Management Studio возвращать строки по умолчанию? Каждый раз, когда я открываю таблицу через меню (например, выбрав return all rows), я получаю самые старые строки вверху. Я знаю, что могу добавить "order by desc" в SQL-заявлении, но набирать текст становится раздражающим:)
Заказать по умолчанию по умолчанию для SQL Server Management Studio?
Ответ 1
Вы не можете изменить существующий шаблон для генерации SELECT из контекстного меню в SSMS.
К счастью, SSMS расширяема. Это означает, что вы можете написать свои собственные расширения, которые могут делать именно то, что вы хотите, или вы можете использовать какое-то существующее решение. Я бы рекомендовал Mladen SSMS Tools Pack:
Это было бесплатно до недавнего времени и по-прежнему относится к версиям 2008r2 и ранее.
Ответ 2
В SQL
нет порядка сортировки по умолчаниюЕсли вы видите "самый старый" сверху, это может быть самым быстрым способом для его восстановления, потому что он хранится на диске.
Вам не гарантировано получить его в этом порядке, считайте его "неупорядоченным", если вы не указали порядок!
ORDER BY
- единственный способ получить результаты в определенном порядке.
Заказ может быть дорогостоящей операцией в зависимости от указанной таблицы и порядка, поэтому неупорядоченная норма.
Ответ 3
Что говорит JNK на 100% правильно.
Но если вы просто хотите нормально работать и только при открытии таблицы, а не при запросе таблицы...
Попробуйте добавить кластерный индекс, причем первое индексированное поле индексируется в порядке убывания. Вероятно, это приведет к тому, что вам нужно.
(Если у вас уже есть кластерный индекс в этом поле, отредактируйте его свойства и измените его порядок.)
Это только разумная идея, если такой индекс является дружественным к фактическому использованию таблицы. Это было бы самозавершением, чтобы иметь индекс, который бесполезен программно, только для вашего удобства;)
Ответ 4
Цитата из Itzik Ben-Gan Основы T-SQL Microsoft SQL Server 2012 → Глава 1 → Теоретическая основа → Теория набора:
... когда вы пишете запросы T-SQL к таблицам в базе данных (например, таблица сотрудников), вы должны думать о наборе сотрудников в целом, а не отдельных сотрудников.... Другими словами, запрос к таблице может возвращать строки таблицы в любом порядке, если вы явно не запросите сортировку данных определенным образом, возможно, для целей презентации.
SSMS не поддерживает настраиваемую инструкцию SELECT по умолчанию. Если он поддерживает, какой столбец должен быть помещен после предложения ORDER BY, учитывая таблицы
- не имеют такого столбца, как 'CreatedDate';
- или чей первичный ключ GUID (порядок не очевиден)
- или не имеют первичного ключа или кластерного индекса
Даже SQL SERVER сможет отображать новейшие данные в какой-то день, это не естественный способ думать о отдельных строках (новейших/старейших) для таблиц. Попробуйте использовать инструкцию UPDATE в сочетании с предложением ORDER BY для обновления новейших данных.
Ответ 5
Посмотрев на выход Profiler, кажется, что запрос генерируется "на лету", поэтому я не буду надеяться на какой-то шаблон, который вы можете изменить где-то
/****** 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
. Имейте в виду, что некоторые из них фиксированы + после того, как вы его настроили и нажмите OK, настройка будет работать только для окон запроса, которые вы недавно открыли, существующие будут работать со старой конфигурацией.
Надеюсь, это немного поможет...
PS: если вы назовете его sp_select_top_n_desc
и скомпилируете его в основной базе данных, вы сможете использовать его по всему серверу без необходимости его развертывания в каждой базе данных. Однако вам, вероятно, придется переключиться на dynamic-sql, а затем префикс всех запросов sys.table
с выходом DB_Name()
, поскольку в противном случае он, вероятно, будет выглядеть в таблице master.sys.columns и т.д., Что не является тем, что вы want =)
Ответ 6
Попробуйте создать представление в этой таблице, как это, и используйте это в предложении select или adhoc query
CREATE VIEW dbo.yourTable_vw
AS
SELECT TOP 100 PERCENT *
FROM yourTable
ORDER BY yourcolumn DESC
GO
Ответ 7
На самом деле вы можете создать addin для ssms, который добавляет новый элемент в контекстное меню объекта explorer.
Задайте этот вопрос: Создайте собственный элемент меню в обозревателе объектов
Другой способ - создать SP, который генерирует и выполняет оператор select с предложением ORDER BY в master db (на всех серверах) и связывает комбинацию клавиш с этим sp.
Ответ 8
Хотя официально нет порядка сортировки по умолчанию для простого линейного ввода, я получаю удовлетворительный порядок сортировки 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...
Ответ 9
для меня - я сначала использую EF-код, но делаю это каждый раз, когда создаю новую таблицу: Таблица правого щелчка, Script Таблица как → Удалить и Создать таблицу, а также отредактировать SQL и сменить ключ на DESC, затем запустите script.. done (нет представления или что-нибудь грязное)