Глядя на вывод Профилировщика, кажется, что запрос генерируется на лету, поэтому я бы не стал надеяться на какой-то шаблон, который вы можете где-то изменить
/****** 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 и т. Д., А это не то, что вы хочу =)