2012-01-13 74 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,然後運行腳本..完成(沒有視圖或任何雜亂)

相關問題