2012-01-13 166 views

回答

3

您无法在SSMS中的上下文菜单中更改现有的用于生成SELECT的模板。

谢天谢地,SSMS是可扩展的。这意味着您可以编写自己的扩展程序,它可以完全按照您的要求进行,也可以使用一些现有的解决方案。我会建议姆拉登的SSMS工具包:

http://www.ssmstoolspack.com/

它是免费的,直到最近,仍然是2008R2和更早版本。

12

在SQL

没有默认的排序顺序如果您看到“最老”的那么这可能是引擎检索它的最快方式,因为它是如何存储在磁盘上的。

您不能保证按照此顺序得到它,除非您指定订单,否则将其视为“无序”!

ORDER BY是以特定顺序产生结果的唯一方法。

根据指定的表格和顺序,订购可能是一个昂贵的操作,所以无序是常态。

+0

我明白你在说什么,但我只是想知道是否有一些在SQL Server管理中设置工作室。 当你右键点击一张桌子时,你可以选择检索'top(x)',我希望设置'order desc' – 2012-10-16 12:14:13

+0

@MartindeWildt'TOP X'只是为了限制结果集。你当然可以添加一个'ORDER BY'。在正常情况下,如果没有连接,返回的结果可能会以聚簇索引键顺序。 – JNK 2012-10-16 12:15:52

+0

我认为这个问题的一个更好的标题可能是“是否有方法来更改SQL Server Management Studio中的默认SELECT查询”? – 2014-04-11 01:56:18

6

JNK说的100%正确。

但如果你只是想让它正常工作,只有当您打开一个表,而当你查询的表比...

尝试增加一个聚集索引,用第一个索引字段按降序编号。这将可能实际上导致你需要什么。

(如果您已经在该领域的一个聚集索引,编辑它的属性并更改其顺序。)


这仅仅是一个明智的想法,如果这样的指数是友好的实际使用桌子。这将是自拆台有那也没用编程,只是为了方便您的索引;)

+1

+1为他可能想要的东西提供解决方法(而不是仅仅告诉他他错了,就像我做的那样:)) – JNK 2012-01-13 15:35:01

+0

如果插入性能不是很糟糕,如果它们在标识列上聚合? – UnhandledExcepSean 2012-01-13 15:58:52

+1

@SpectralGhost是的,我认为这可能会导致逻辑碎片问题。如果逻辑上它们需要在文件中较早的位置,则分配的新扩展区可能会位于文件中稍后的页码处。 – 2012-01-13 16:54:40

2

从伊茨克奔甘的Microsoft SQL Server 2012 T-SQL Fundamentals报价 - >第1章 - >理论背景 - >集理论:

。 ..当您针对数据库中的表(例如员工表)编写T-SQL查询时,您应该将整套员工视为一个整体而不是单个员工。 ... 换句话说,对表的查询可以按任意顺序返回表行,除非您明确要求以特定方式对数据进行排序,可能用于演示目的。

SSMS不支持自定义的默认SELECT语句。如果它支持,应在ORDER BY子句之后放置哪一列,考虑表格

  1. 没有像'CreatedDate'这样的列;
  2. 或者其主键是GUID(为了不明显)
  3. 或不具有主键或聚集索引

即使SQL Server将能够有一天列出最新的数据,它不是一种自然的方式来根据表来思考单个行(最新/最旧)。尝试使用与ORDER BY子句结合的UPDATE语句来更新最新的数据。

2

纵观探查器的输出,它似乎在飞行中生成的查询,所以我不会把我的希望寄托在一些模板,你可以改变的地方

/****** 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,然后使用DB_Name()的输出前缀所有sys.table查询的前缀,否则它可能会查看master.sys.columns表等。这是不是你想要的=)

2

尝试建立这样该表的看法和使用,在您的SELECT子句或即席查询

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

其实你可以创建SSMS,增加了一个新的插件项目添加到对象浏览器的上下文菜单中。

检查这个问题:Create custom menu item in Object Explorer

另一种方法是创建生成并执行与ORDER BY在主数据库(所有服务器上)子句的select语句的SP和绑定键盘快捷键是SP。

0

虽然官方没有默认排序顺序为简单的线性输入我得到满意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

我 - 我使用EF代码第一,但做到这一点,每当我创建一个新表: 右键单击表,脚本表为 - >删除&创建表,并编辑SQL并将密钥更改为DESC,然后运行脚本..完成(没有视图或任何杂乱)

相关问题