SQL Server Management Studio – 改进TSQL编码过程的技巧
我曾经在一个普遍使用Pair Programming的地方工作。 我记得在代码上一起工作时,我们可以相互学习多less个小东西。 随着时间的推移拾取新的快捷方式,代码片段等显着提高了我们编写代码的效率。
自从我开始使用SQL Server以来,我一直都是自己做的。 我通常会select与其他人一起工作的最好的习惯,而现在我不能这样做。
所以这里是一个问题:
- 关于使用SQL Server Management Studio有效编写TSQL代码的技巧?
- 请保持提示2 – 3的东西/捷径,你认为提高你的编码速度
- 请保持在TSQL和SQL Server Management Studio 2005/2008的范围内如果该function特定于Management Studio的版本,请指明:例如“仅适用于SQL Server 2008”
编辑:
恐怕我可能被你们中的一些人误解了。 我不是在寻找编写高效TSQL代码的技巧,而是寻求如何有效地使用Management Studio来加速编码过程本身的build议。
我正在寻找的答案types是:
- 使用模板,
- 键盘快捷键,
- 使用IntelliSense插件等
基本上那些使编码体验更有效和愉快的小事情。
看看Red Gate的SQL Prompt – 这是一个很棒的产品(与Red Gate的大部分贡献一样)
SQL Inform也是一个很好的免费(在线)工具,用于格式化有时可能失控的长程序。
除此之外,我从痛苦的经验中学到了在 BEGIN TRANSACTION
使用 DELETE
语句 之前的好处。 一旦你确定你的陈述只是删除它应该,然后你可以COMMIT
。
多次保存了我;-)
社区拥有的维基答案 – 随时编辑或添加评论:
键盘快捷键
- F5 , CTRL + E或ALT + X – 执行当前选定的TSQL代码
- CTRL + R – 显示/隐藏结果窗格
- CTRL + N – 打开新的查询窗口
- CTRL + L – 显示查询执行计划
编辑快捷键
- CTRL + K + C和CTRL + K + U – 注释/取消注释选定的代码块(由Unslicedbuild议)
- CTRL + SHIFT + U和CTRL + SHIFT + L – 将选定文本更改为UPPER /小写
- SHIFT + ALT +select文本 – select/剪切/复制/粘贴一个矩形的文本块
插件
- 红门的SQL提示 – IntelliSense(由Galwegianbuild议)
- SQLinForm – TSQL的格式(由Galwegianbuild议)
- 穷人的T-SQL Formatter – 开源格式化插件
其他技巧
- 使用逗号前缀样式(由Cade Rouxbuild议)
- 使用键盘快捷键(由kcrumleybuild议)
有用的链接
- SQL Server Management Studio键盘快捷键(完整列表)
SQL Prompt +1。
一些真正简单的东西,我想我从来没有见过 – 这将适用于任何SQL环境(甚至其他语言):
在经过了12年的SQL编码之后,我最近变成了在SSMS生成的代码中看到它后转换为逗号前缀风格,我发现它非常有效。 我很惊讶,以前从未见过这种风格,尤其是因为它极大地提高了我的生产力。
SELECT ta ,tb ,tc ,td FROM t
它使得编辑select列表,参数列表,按列表sorting,按列表分组等非常简单。我发现我花费了大量的时间,在剪切后添加和删除列表末尾的逗号,和粘贴操作 – 我想这样做更容易,因为你几乎总是在最后添加东西,而用后缀逗号,则需要更多的移动光标。
试试吧,你会感到惊讶 – 我知道我是。
我最喜欢的快速提示是,当您在对象资源pipe理器中展开表名时,只要将单词列拖到查询屏幕,就会将表中所有列的列表放入查询中。 删除那些你不想要的东西要比input你想要的更容易,而且非常简单,它可以防止人们使用真正糟糕的select *语法。 它可以防止错别字。 当然你也可以单独拖动列。
在查询中突出显示一个实体并按下ALT + F1将为其运行sp_help,从而为您提供任何列,索引,参数等的细目。
尝试始终使用可以使用的最小数据types,并索引查询中最常用的所有字段。
尽量避免服务器端游标。 始终坚持“基于集合的方法”,而不是“程序方法”来访问和操作数据。 游标通常可以通过使用SELECT语句来避免。
请始终在查询分析器或SHOWPLAN_TEXT或SHOWPLAN_ALL命令中使用graphics执行计划来分析您的查询。 确保您的查询执行“索引search”而不是“索引扫描”或“表扫描”。 表扫描或索引扫描是非常糟糕的事情,应尽可能避免。 在右栏select正确的索引。 使用更可读的ANSI-Standard Join子句而不是旧式联接。 使用ANSI连接时,WHERE子句仅用于过滤数据。 与旧式联接一样,WHERE子句同时处理联接条件和筛选数据。
不要让您的前端应用程序直接使用SELECT或INSERT / UPDATE / DELETE语句查询/操作数据。 相反,创build存储过程,并让您的应用程序访问这些存储过程。 这样可以使数据访问在应用程序的所有模块之间始终保持一致,并同时集中数据库中的业务逻辑。
说到存储过程,不要将存储过程名称作为“sp_”的前缀。 前缀sp_是为SQL Server附带的系统存储过程保留的。 每当SQL Server遇到一个以sp_开头的过程名称时,它首先尝试在master数据库中find该过程,然后查找提供的任何限定符(数据库,所有者),然后尝试dbo作为所有者。 所以你可以通过避免使用“sp_”前缀来节省查找存储过程的时间。
避免dynamicSQL语句尽可能多。 dynamicSQL往往比静态SQL慢,因为SQL Server每次运行时都必须生成一个执行计划。
何时可以尝试使用集成身份validation。 这意味着,忘记sa和其他SQL用户,使用微软用户configuration基础架构,并始终保持您的SQL服务器,与所有必需的修补程序保持最新。 微软在开发,testing和发布补丁方面做得很好,但是这是你的工作。
在亚马逊网站search有好评的书,并购买它!
用于增量search的 CTRL + I。 按F3或CTRL + I循环查看结果。
如果从对象浏览器的“列”节点中为某个表格拖放,则会在查询窗口中为您放置一列CSV列表
键盘加速器。 一旦确定了你写了多less种查询,编写实用程序存储过程来自动执行这些任务,并将它们映射到键盘快捷方式。 例如, 本文将讨论如何避免每次只想快速查看表格中的示例数据时,从“SomeBigTable”中input“select top 10 *”。 我已经得到了这个过程的大大扩展版本,映射到CTRL + 5 。
我还有几个:
- CTRL + 0 :快速编写表格的数据,proc,UDF或视图的定义
- CTRL + 9 :find名字中包含给定string的任何对象(因为当你知道你的名字中有一个“Option”的过程,但你不知道它的名字是以什么开头的)
- CTRL + 7 :find代码中包含给定string的任何proc,UDF或视图
- CTRL + 4 :find所有具有给定名称的列的表
…还有一些现在不想到的东西。 其中一些可以通过SSMS中的现有接口来完成,但是SSMS的窗口和小部件可能会有点慢加载,特别是当你在互联网上查询服务器时,我不希望把我的手拿起来键盘无论如何。
只是一个小小的select – 矩形selectALT + DRAG
进来复制粘贴垂直alignment的列列表(例如,当手动编写一个大规模的更新)真的很方便。 编写TSQL是我使用它的唯一时间!
对于子查询
对象浏览器>右键单击一个表格>脚本表格>select到>剪贴板
然后,你可以粘贴在你想要的部分作为子查询。
模板/片段
只用一段代码创build你自己的模板。 然后,将模板作为新文档打开,只需将其拖到当前查询中即可插入片段。
一个片段可以简单地成为一个带有注释的标题或者一些简单的代码。
隐式事务
如果你不记得在你的删除状态之前开始一个事务,你可以在所有的查询中默认select并设置隐式事务。 他们总是需要一个明确的提交/回滚。
隔离级别
转到选项,默认情况下将隔离级别设置为READ_UNCOMMITED。 这样你就不需要在所有的特别查询中input一个NOLOCK。 当写一个新的视图或存储过程时,不要忘记放置表提示。
默认数据库
您的login有一个由DBA设置的默认数据库(对于我来说,几乎每次都是不受欢迎的数据库)。
如果你希望它是一个不同的,因为你正在进行的项目。
在“注册的服务器”窗格中>右键单击>属性>连接属性选项卡>连接到数据库。
多个login
(这些你可能已经完成了)
多次注册服务器,每个都使用不同的login名。 然后,您可以在对象浏览器中打开多个相同的服务器(每个都使用不同的login名)。
要执行已经使用不同login名写入的相同查询,而不是复制查询,只需在查询窗格>连接>更改连接上单击鼠标右键即可。
另一件事,有助于提高我所做的准确性不是一个pipe理工作室的提示,而是一个使用t-sql本身。
每当我第一次写更新或删除语句时,我都会join一个select,以便我可以看到哪些logging会受到影响。
例子:
select t1.field1,t2.field2 --update t --set field1 = t2.field2 from mytable t1 join myothertable t2 on t1.idfield =t2.idfield where t2.field1 >10 select t1.* --delete t1 from mytable t1 join myothertable t2 on t1.idfield =t2.idfield where t2.field1 = 'test'
(注意我在这里只是为了说明而使用了select *,通常我只需要select几个字段来查看查询是否正确,有时我可能需要查看join中其他表的字段以及我计划的logging删除以确保连接以我认为的方式工作)
运行此代码时,首先运行select以确保它是正确的,然后注释select行并取消注释删除或更新部分。 通过这样做,在检查之前,您不会意外地运行删除或更新。 此外,您还可以避免忘记注销select,导致更新更新数据库表中可能发生的所有logging(如果使用此语法),并取消select运行它的问题:
select t1.field1,t2.field2 update t set field1 = t2.field2 --select t1.field1,t2.field2 from mytable t1 join myothertable t2 on t1.idfield =t2.idfield where t2.field1 >10
从上面的例子可以看出,如果取消select注释并忘记重新注释,哎呀,你只是更新整个表,然后运行一个select,当你想运行更新。 这个星期有人在我的办公室这样做了,所以只有一个所有的客户可以login到客户的网站。 所以避免这样做。
使用对象资源pipe理器中的“filter”button,可以从名称中的部分文本快速查找特定对象(表,存储过程等),或查找属于特定模式的对象。
我有一个计划任务,每晚写每个对象(表,sproc等)到一个文件。 我在输出目录中设置了全文search索引,所以当我在寻找一个被埋在数据库中的某个string(例如一个常量)时,我可以很快find它。
在Management Studio中,您可以使用Tasks> Generate Scrips …命令来查看如何执行此操作。
我喜欢将CTRL + F1的快捷键设置为sp_helptext ,因为这样可以突出显示存储过程并快速查看代码。 我发现这是默认的ALT + F1 sp_help快捷键的一个很好的补充。
我build议你为你的SQL脚本创build标准并坚持下去。 还可以使用模板快速创build不同types的存储过程和函数。 这是一个关于SQL Server 2005 Management Studio中的模板的问题
如何在SQL Server 2005 Management Studio中创buildSQL Server 2005存储过程模板?
我是最近为SSMS2008 / R2发布的SSMSBoost加载项的开发者,目的是添加加速日常例行任务的function:
Shorcut: F2 – (在SQL编辑器中):脚本对象位于unted游标
CTRL + F2 – (在SQL编辑器中):在对象资源pipe理器中查找位于光标下方的对象,并将其聚焦+它包括快捷方式编辑器,在SSMS2008中丢失(即将在SSMS2012中)
还SSMSBoost添加button的工具栏:
- 将SQL编辑器连接同步到对象资源pipe理器(在对象资源pipe理器中关注当前数据库
- pipe理您自己的首选连接,并通过combobox(包括服务器之间的跳转)
- 自动replace:input“ sel ”将会用
select * from
代替它,你也可以添加你自己的令牌replace对 - 和一些更有用的function
用CTRL + SHIFT + Q显示查询devise器
利用TRY / CATCHfunction来捕捉错误。
Adam Machanic的SQL Server 2005专家编程是一个强大的技术和实践资源。
使用所有权链接存储过程。
利用模式来执行数据安全和angular色。
使用对象资源pipe理器详细信息而不是对象资源pipe理器查看您的表,这样您可以按一个字母,并将其转到具有该字母前缀的第一个表。
如果你和开发人员一起工作,经常会得到一小段格式化为一行代码的代码,那么SQL Serverpipe理工作室的sql漂亮打印机插件可能会对超过60多个格式化程序选项有所帮助。 http://www.dpriver.com/sqlpp/ssmsaddin.html
使用书签是保持理智的好方法,如果您正在使用或排除一个非常长的过程。 假设您正在使用外部查询中的派生字段,并且它的内部查询中的定义是另外200行。 您可以为两个位置添加书签,然后快速在两者之间来回切换。
如果你需要为某种API编写大量的sprocs。 当我还是程序员的时候,你可能会喜欢这个工具。 假设你有一个200列表,需要有一个sproc写入插入/更新和另一个删除。 因为你不希望你的应用程序直接访问表。 只是声明部分将是一个乏味的任务,但不是如果代码的一部分是为你写的。 这是一个例子…
CREATE PROC upsert_Table1(@col1 int, @col2 varchar(200), @col3 float, etc.) AS BEGIN UPDATE table1 SET col1 = @col1, col2 = @col2, col3 = @col3, etc. IF @@error <> 0 INSERT Table1 (col1, col2, col3, etc.) VALUES(@col1, @col2, @col3, etc.) END GO CREATE PROC delete_Table1(@col1) AS DELETE FROM Table1 WHERE col1 = @col1
http://snipplr.com/view/13451/spcoldefinition-or-writing-upsert-sp-in-a-snap/
注意:你也可以到2002年写的原始代码和文章(我现在觉得老了!)
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=549&lngWId=5
突出显示的文本上使用选项卡将缩进它。 很容易以可读的格式安排您的代码。 另外, SHIFT + TAB将会是unindent。
F5运行当前查询是一个简单的胜利,之后, CTRL + K + C的通用MS编辑器命令将所选文本注释掉,然后CTRL + K + U取消注释。
-
ALT+SHIFT
+select
这是我最近发现的一个好东西 – 它可以让你select一个矩形的文本部分,不pipe换行符是什么。 非常方便快速删除子查询或列表。
Devart的SQL Complete Express版本是一个SSMS插件,是一个免费且有用的插件。 它提供了非常需要的代码格式和智能感知function。
我也使用SSMSToolsPack
插件,这是非常好的。 我爱;
- 这是SQL代码片段,您可以在代码片段中创build简短键,并在键入这些键时自动添加它们,然后按Enter键。
- 通过历史search来检索你在几个月前跑了几次而忘了的查询,节省了我很多的时间。
- 恢复上个会话。 现在我从来没有保存我的查询,如果我不得不重新启动我的窗户。 我只需点击恢复上次会话,我的最后一个会话得到并恢复,连接自动创build。
- 从查询结果创build插入语句(非常有用)。 只是喜欢这个插件。
最近引进了一个小渔获。 SSMSToolsPack已经不再适用于SSMS 2012,SSMS 2005和SSMS 2008仍然是免费的。 只有在你想迁移到SSMS 2012的时候才需要购买它。否则,可能是离开它是个好主意。
我热烈推荐Red Gate的SQL Prompt。 自动发现(表格,存储过程,函数和本地函数的智能感知)简直太棒了! 🙂
它来与一个价格虽然。 没有免费软件版本的东西。
了解SQL Server Management Studio中可用的两种(?)不同types的窗口。
如果右键单击一个表并select“ Open
,将使用可修改的网格,您可以修改其中的单元格。如果右键单击该数据库并select“ New Query
,将创build一个稍微不同的窗口types,网格中,但它给你一些其他很好的function,如允许不同的代码片段,让你分开执行它们的select。
使用SELECT INTO
查询可以快速/轻松地使备份表正常工作并进行试验。