SQL Server程序员经常要在SSMS(SQL Server Management Studio)或查询分析器(2000以前)中编写T-SQL代码。以下几个技巧,可以提升工作效率。
以下说明以SS2005为例,SS2008也适用;SS2000的话可能部分适用吧。
1. 快捷键
现在只要不是电脑新手,都知道Ctrl+C/Ctrl+V,没什么人会用菜单去进行复制/粘贴。而对于靠电脑吃饭的程序员来说,只知道这两个快捷键是不够的。
善用快捷键,可以节省用鼠标去找图标或菜单的时间。更炉火纯青的状态是全键盘操作,连把手移动到鼠标的时间都省了(UNIX程序员都是这么干的)。
在SSMS选择菜单:工具->自定义,勾选“在屏幕提示中显示快捷键”,这样,当把鼠标悬停在执行图标上方时,会显示提示F5。快捷键不需要死记,鼠标点的时候看一下,下次就可以用快捷键了,用多了就熟了。
---------
快捷键:
书签:清除所有书签。 CTRL-SHIFT-F2
书签:插入或删除书签(切换)。 CTRL+F2
书签:移动到下一个书签。 F2 功能键
书签:移动到上一个书签。 SHIFT+F2
取消查询。 ALT+BREAK
连接:连接。 CTRL+O
连接:断开连接。 CTRL+F4
连接:断开连接并关闭子窗口。 CTRL+F4
数据库对象信息。 ALT+F1
编辑:清除活动的编辑器窗格。 CTRL+SHIFT+DEL
编辑:注释代码。 CTRL+SHIFT+C
编辑:复制。还可以使用 CTRL+INSERT。 CTRL+C
编辑:剪切。还可以使用 SHIFT+DEL。 CTRL+X
编辑:减小缩进。 SHIFT+TAB
编辑:在编辑器窗格中删除至行尾。 CTRL+DEL
编辑:查找。 CTRL+F
编辑:转到行号。 CTRL+G
编辑:增大缩进。 TAB
编辑:使选定内容为小写。 CTRL+SHIFT+L
编辑:使选定内容为大写。 CTRL+SHIFT+U
编辑:粘贴。还可以使用 SHIFT+INSERT。 CTRL+V
编辑:删除注释。 CTRL+SHIFT+R
编辑:重复上次搜索或查找下一个。 F3 功能键
编辑:替换。 CTRL+H
编辑:全选。 CTRL+A
编辑:撤消。 CTRL+Z
执行查询。还可以使用 CTRL+E (针对向后兼容性)。 F5 功能键
SQL 查询分析器帮助。 F1 功能键
对所选 Transact-SQL 语句的帮助。 SHIFT+F1
浏览:在查询窗格和结果窗格之间切换。 F6 功能键
浏览:切换窗格。 Shift+F6
浏览:窗口选择器。 CTRL+W
"新建查询"窗口。 CTRL+N
对象浏览器(显示/隐藏)。 F8 功能键
对象搜索。 F4 功能键
分析查询并检查语法。 CTRL+F5
打印。 CTRL+P
结果:以表格格式显示结果。 CTRL+D
结果:以文本格式显示结果。 CTRL+T
结果:移动拆分器。 CTRL+B
结果:将结果保存为文件。 CTRL+SHIFT+F
结果:显示结果窗格(切换)。 CTRL+R
保存。 CTRL+S
模板:插入模板。 CTRL+SHIFT+INSERT
模板:替换模板参数。 CTRL+SHIFT+M
优化:显示预估执行计划。 CTRL+L
优化:显示执行计划(切换开/关)。 CTRL+K
优化:索引优化向导。 CTRL+I
优化:显示客户统计 CTRL+SHIFT+S
优化:显示服务器跟踪。 CTRL+SHIFT+T
使用数据库。 CTRL+U
----------------
2. 自定义快捷键
SQL Server Management Studio支持自定义快捷键:工具->选项->键盘:
其中,Alt+F1、Ctrl+1、Ctrl+2是系统预定义的快捷键。
双击表名(或按Ctrl单击表名),选定一个表名,如tablename,按Alt+F1,相当于执行“sp_help tablename”,可以查看对象的说明信息。
以下是我添加的一些自定义快捷键:
[code=sql]
--Ctrl+F1:显示表或视图的前100行,选定“tablename,1000”按Ctrl+F1可显示表的前1000行。
sp_executesql N'IF OBJECT_ID(@tablename) IS NOT NULL EXEC(N''SELECT TOP(''+@n+N'') * FROM ''+@tablename)',N'@tablename nvarchar(100),@n int=100',
或查询最后100行 sp_executesql N'IF OBJECT_ID(@tablename) IS NOT NULL EXEC(N''SELECT TOP(''+@n+N'') * FROM ''+@tablename +'' ORDER BY ''+@tablename+''Id DESC'' )',N'@tablename nvarchar(100),@n int=100',
或者
sp_executesql N'IF OBJECT_ID(@tablename) IS NOT NULL BEGIN TRY EXEC(N''SELECT TOP(''+@n+N'') * FROM ''+@tablename +'' ORDER BY ''+@tablename+''Id DESC'' ) END TRY BEGIN CATCH EXEC(N''SELECT TOP(''+@n+N'') * FROM ''+@tablename) END CATCH ',N'@tablename nvarchar(100),@n int=100',
或者
sp_executesql N'DECLARE @tempsql nvarchar(1024); declare @temp NVARCHAR(20);set @tempsql = N''SELECT TOP 1 @temp = a.name from syscolumns a(nolock), sysobjects b(nolock) where a.id=b.id and b.name=''''''+@tablename +''''''ORDER BY a.colid ;'';exec sp_executesql @tempsql,N''@temp NVARCHAR(20) output'',@temp OUTPUT ; IF OBJECT_ID(@tablename) IS NOT NULL BEGIN TRY EXEC(N''SELECT TOP(''+@n+N'') * FROM ''+@tablename +'' ORDER BY ''+@tablename+''Id DESC'' ) END TRY BEGIN CATCH EXEC(N''SELECT TOP(''+@n+N'') * FROM ''+@tablename +'' ORDER BY ''+@temp+'' DESC'') END CATCH ',N'@tablename nvarchar(100),@n int=100 ',
--Ctrl+3:显示视图、存储过程、函数、触发器的定义脚本。
sp_helptext
--Ctrl+4:显示表的行数和占用空间。
sp_spaceused
--Ctrl+5:显示表中每个索引占用的空间。
sp_executesql N'SELECT index_name = ind.name, ddps.used_page_count, ddps.reserved_page_count, ddps.row_count FROM sys.indexes ind INNER JOIN sys.dm_db_partition_stats ddps ON ind.object_id = ddps.object_id AND ind.index_id = ddps.index_id WHERE ind.object_id = OBJECT_ID(@tablename)',N'@tablename nvarchar(100)'
--给表添加表描述(Q为分割线,前面是表名,后面是表描述)
sp_executesql N'DECLARE @tempName NVARCHAR(100) ;DECLARE @tempTable NVARCHAR(100) ;SELECT @tempName = STUFF(@tempTxt,1,charindex(''Q'',''''+@tempTxt +''''),'''');SELECT @tempTable = SUBSTRING(@tempTxt,1,charindex(''Q'',''''+@tempTxt +'''')-1);IF @tempTxt<> '''' BEGIN EXECUTE sp_addextendedproperty N''MS_Description'', @tempName, N''user'', N''dbo'', N''table'', @tempTable;EXEC sp_helpremark @tempTable;END',N'@tempTxt nvarchar(200)', TestQ测试
--Ctrl+9:显示表或视图的字段名,以逗号分隔。
sp_executesql N'SELECT columns = STUFF((SELECT '', ''+name FROM sys.columns WHERE object_id = OBJECT_ID(@tablename) FOR XML PATH('''')),1,2,'''')',N'@tablename nvarchar(100)'
--Ctrl+0:根据选定关键词在当前数据库中查找表、视图、存储过程、函数
sp_executesql N'SELECT * FROM sys.objects WHERE type IN (''U'',''V'',''P'',''FN'') AND name LIKE ''%''+@keyword+''%'' ORDER BY type,name',N'@keyword nvarchar(50)'
查询前100行: sp_executesql N'IF OBJECT_ID(@tablename) IS NOT NULL EXEC(N''SELECT TOP(''+@n+N'') * FROM ''+@tablename)',N'@tablename nvarchar(100),@n int=100',
查询前1000行(如果包含CreateDate字段就倒序查最后1000行): sp_executesql N'IF OBJECT_ID(@tablename) IS NOT NULL begin if col_length(''IQCCheckOrder'',''CreateDate'') is null begin EXEC(N''SELECT TOP(''+@n+N'') * FROM ''+@tablename) end else begin EXEC(N''SELECT TOP(''+@n+N'') * FROM ''+@tablename + '' order by CreateDate desc '') end end',N'@tablename nvarchar(100),@n int=1000',
相关依赖: sp_executesql N'SELECT * FROM sys.objects WHERE type IN (''U'',''V'',''P'',''FN'') AND name LIKE ''%''+@keyword+''%'' ORDER BY type,name',N'@keyword nvarchar(50)',
索引信息: sp_executesql N'SELECT index_name = ind.name, ddps.used_page_count, ddps.reserved_page_count, ddps.row_count FROM sys.indexes ind INNER JOIN sys.dm_db_partition_stats ddps ON ind.object_id = ddps.object_id AND ind.index_id = ddps.index_id WHERE ind.object_id = OBJECT_ID(@tablename)',N'@tablename nvarchar(100)',
表列名: sp_executesql N'SELECT columns = STUFF((SELECT '', ''+name FROM sys.columns WHERE object_id = OBJECT_ID(@tablename) FOR XML PATH('''')),1,2,'''')',N'@tablename nvarchar(100)',
存储过程搜索:
sp_executesql N'SELECT DISTINCT name from sysobjects o, syscomments s where o.id = s.id and text like ''%''+@keyword+''%'' and o.xtype = ''P''',N'@keyword nvarchar(50)',
1、自定义4个常用的存储过程:
sp_select :select * from
sp_helpremark :查表的列,列的类型,备注(这里只查询有备注的列)
sp_columns1 : 查表所有的列,列的类型,length
sp_columns2 :查表所有的列,横向显示
注意:上面4个自定义存储过程,必须在查询分析器中执行后,才能快捷键使用。
A) sp_select :
CREATE proc sp_select(@sql varchar(1000)) as begin set @sql='select * from ' + @sql; exec (@sql); end
B) sp_helpremark :
CREATE PROC [dbo].[sp_helpremark] @TABLE_NAME VARCHAR(50) AS SELECT COLID,SO.NAME,EP.VALUE,SO.LENGTH,MIN(ST.NAME) AS TYPE FROM SYS.EXTENDED_PROPERTIES EP RIGHT JOIN SYS.SYSCOLUMNS SO ON MAJOR_ID=ID AND COLID=MINOR_ID LEFT JOIN SYS.SYSTYPES ST ON ST.XTYPE=SO.XTYPE WHERE ID=OBJECT_ID(@TABLE_NAME) GROUP BY COLID,SO.NAME,EP.VALUE,SO.LENGTH ORDER BY COLID
C) sp_columns1 :
CREATE PROC sp_columns1 @table_name VARCHAR(1000) AS BEGIN SELECT a.name,c.data_type,a.length FROM syscolumns a LEFT JOIN information_schema.columns c ON a.name=c.column_name WHERE a.ID = OBJECT_ID (@table_name) END
D) sp_columns2 :
CREATE PROC sp_columns2(@table_name VARCHAR(1000)) AS BEGIN DECLARE @column_name VARCHAR(100)--列名 DECLARE @columns VARCHAR(1000)--所有列名 SELECT @columns='' DECLARE mycursor cursor FOR SELECT name FROM syscolumns WHERE id=(SELECT id FROM sysobjects WHERE name=@table_name) OPEN mycursor FETCH NEXT FROM MyCursor INTO @column_name WHILE @@FETCH_STATUS =0 BEGIN SELECT @columns=@columns+@column_name+',' FETCH NEXT FROM MyCursor INTO @column_name END CLOSE MyCursor DEALLOCATE MyCursor SELECT @columns END
2、打开数据库,工具>>选项>>键盘:
在存储过程列里,填写按快捷键时执行的存储过程(注:这里的存储过程列需要 写入特定的方法名)
再根据上面4个自定义的存储过程名称,选择对应不同的快捷键,确定完成。
>>>>>>>>>>>>使用方法:
打开查询分析器: 直接写表名,选中,并按目标快捷组合键,完成查询。