SQL Server Management Studio – 改进 TSQL 编码过程的技巧
Posted
技术标签:
【中文标题】SQL Server Management Studio – 改进 TSQL 编码过程的技巧【英文标题】:SQL Server Management Studio – tips for improving the TSQL coding process 【发布时间】:2010-09-11 04:38:31 【问题描述】:我曾经在一个常见的做法是使用结对编程的地方工作。我记得当我们一起编写代码时,我们可以互相学习多少小东西。随着时间的推移,学习新的快捷方式、代码 sn-ps 等显着提高了我们编写代码的效率。
自从我开始使用 SQL Server 以来,我一直独自一人。我通常会从与我现在无法做到的其他人一起工作中挑选出的最佳习惯。
那么问题来了:
您有哪些高效的提示 使用 SQL Server 编写 TSQL 代码 管理工作室? 请保留 2 – 3 件事/捷径的提示 你认为提高你的速度 编码 请保持在范围内 TSQL 和 SQL Server 管理 Studio 2005/2008 如果该功能是 具体到版本 管理工作室请注明: 例如“适用于 SQL Server 2008 仅”编辑:
恐怕我会被你们中的一些人误解。 我不是在寻找编写高效 TSQL 代码的技巧,而是寻找有关如何有效使用 Management Studio 来加速编码过程本身的建议。
我正在寻找的答案类型是:
模板的使用, 键盘快捷键, 使用 IntelliSense 插件等。基本上是那些让编码体验更加高效和愉快的小事情。
【问题讨论】:
【参考方案1】:使用 CTRL + SHIFT + Q
显示 查询设计器【讨论】:
也不要害怕/羞于使用它。这是建立联系和加入方向的好地方。【参考方案2】:使用对象资源管理器中的过滤器按钮从名称中的部分文本中快速查找特定对象(表、存储过程等)或查找属于特定架构的对象。
【讨论】:
【参考方案3】:CTRL + I 用于incremental search。按 F3 或 CTRL + I 循环显示结果。
【讨论】:
【参考方案4】:Devart' SQL Complete express edition 是一个 SSMS 插件,是一个免费且有用的插件。它提供了急需的代码格式化和智能感知功能。
我也使用SSMSToolsPack
插件,它非常好。我爱;
-
它是 SQL sn-ps,您可以在其中为代码 sn-ps 创建短键,并在您键入这些键并按 Enter 时自动附加它们。
搜索历史记录以检索您几个月前运行但忘记的查询,节省了我很多时间。
恢复上一个会话。现在,如果我必须重新启动我的 Windows,我永远不会保存我的查询。我只需点击恢复上次会话,我的上次会话就会自动恢复并自动创建连接。
根据查询结果创建插入语句(非常有用)。
就是喜欢这个插件。
最近推出了一个小渔获物。 SSMSToolsPack 对于 SSMS 2012 不再免费。对于 SSMS 2005 和 SSMS 2008,它仍然是免费的,到目前为止。仅当您想在迁移到 SSMS 2012 时购买它时才使用它。否则,放弃它可能是个好主意。
【讨论】:
【参考方案5】:ALT+SHIFT
+ 选择
这是我最近发现的一个很棒的方法——它可以让你选择一个矩形的文本部分,而不管换行符如何。非常方便快速裁剪子查询或列表。
【讨论】:
【参考方案6】:F5 运行当前查询很容易获胜,之后,CTRL + K + C 的通用 MS 编辑器命令注释掉选定的文本,然后 CTRL + K + U 取消注释。
【讨论】:
【参考方案7】:只是一个很小的 - 矩形选择 ALT + DRAG
非常方便复制和粘贴垂直对齐的列列表(例如,当手动编写大量更新时)。写 TSQL 是我唯一一次使用它!
【讨论】:
问题是,当所有这些微小的部分加在一起并正确使用时,可以产生真正的影响【参考方案8】:我是最近为 SSMS2008/R2 发布的 SSMSBoost 插件的开发人员,目的是添加加速日常任务的附加功能:
快捷键: F2 - (在 SQL 编辑器中):脚本对象位于未绑定的光标
CTRL + F2 -(在 SQL 编辑器中):在对象资源管理器中找到位于光标下的对象并将其聚焦 +它包括 SSMS2008 中缺少的快捷方式编辑器(SSMS2012 中即将推出)
SSMSBoost 还添加了带有按钮的工具栏:
将 SQL 编辑器连接同步到对象资源管理器(在对象资源管理器中关注当前数据库) 管理您自己的首选连接并通过组合框在它们之间切换(包括服务器之间的跳转) 自动替换:输入“sel”将替换为select * from
,您还可以添加自己的令牌替换对
还有一些更有用的功能
【讨论】:
【参考方案9】:突出显示查询中的实体并按 ALT + F1 将为它运行 sp_help,为您提供任何列、索引、参数等的细分。
【讨论】:
我喜欢 Alt-F1;几乎每天都使用它。在我编写插入或更新语句时,可以轻松地缩短列名。【参考方案10】:我喜欢将 CTRL + F1 的键盘快捷键设置为 sp_helptext,因为这样可以突出显示存储过程并快速查看在它的代码。我发现它是对默认 ALT + F1 sp_help 快捷方式的一个很好的补充。
【讨论】:
在按 Ctrl-F1 之前先按 Ctrl-T 将结果输出为文本,以便您可以复制它。【参考方案11】:在突出显示的文本上使用 TAB 会缩进它。很适合以可读的格式轻松安排您的代码。此外,SHIFT + TAB 将取消缩进。
【讨论】:
【参考方案12】:键盘加速器。一旦你弄清楚你写了很多什么样的查询,编写实用程序存储过程来自动执行任务,并将它们映射到键盘快捷键。例如,this article 讨论了如何避免在每次您只想快速查看该表中的示例数据时键入“select top 10 * from SomeBigTable”。我有这个过程的一个大大扩展的版本,映射到 CTRL + 5。 我还有一些:
-
CTRL + 0:快速编写表格数据、proc、UDF 或视图定义的脚本
CTRL + 9:查找名称中包含给定字符串的任何对象(因为当您知道名称中带有“Option”但您不知道的过程时它的名字以什么开头)
CTRL + 7:查找在其代码中包含给定字符串的任何 proc、UDF 或视图
CTRL + 4:查找所有具有给定名称的列的表
...还有一些现在还没有想到的。其中一些事情可以通过 SSMS 中的现有界面来完成,但是 SSMS 的窗口和小部件加载速度可能会有点慢,尤其是当您通过 Internet 查询服务器时,我宁愿不必举手还是键盘。
【讨论】:
如果您可以粘贴用于每个命令的 SQL,那将非常有用。【参考方案13】:社区拥有的 wiki 答案 - 随意编辑或添加 cmets:
键盘快捷键
F5, CTRL + E 或 ALT + X - 执行当前选择的TSQL代码 CTRL + R – 显示/隐藏结果窗格 CTRL + N – 打开新的查询窗口 CTRL + L – 显示查询执行计划编辑快捷方式
CTRL + K + C 和 CTRL + K + U - 注释/取消注释选定的代码块(由 Unsliced 建议) CTRL + SHIFT + U 和 CTRL + SHIFT + L - 将选定文本更改为大写/小写 SHIFT + ALT + 选择文本 - 选择/剪切/复制/粘贴矩形文本块插件
Red Gate's SQL Prompt - IntelliSense(Galwegian 建议) SQLinForm - TSQL 格式(Galwegian 建议) Poor Man's T-SQL Formatter - 开源格式化插件其他提示
使用逗号前缀样式(Cade Roux 建议) 使用键盘加速器(由 kcrumley 建议)有用的链接
SQL Server Management Studio Keyboard Shortcuts (full list)【讨论】:
如果有活动选择,F5 也将只执行选定的文本。 从对象浏览器中拖放列而不是使用选择 * 就此而言,拖放所有类型的对象名称以防止输入错误 我经常注释/取消注释选定的代码块,我将它们分别分配给 [ALT-C] 和 [ALT-B](使用加速键,因为 SSMS08 不执行真正的键盘映射)。【参考方案14】:如果您需要为某种 API 编写大量存储过程。你可能喜欢我当程序员时写的这个工具。假设您有一个 200 列的表,需要编写一个存储过程来插入/更新和另一个存储过程来删除。因为您不希望您的应用程序直接访问这些表。仅声明部分将是一项繁琐的任务,但如果部分代码是为您编写的,则不会。这是一个例子......
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
【讨论】:
【参考方案15】:如果您从对象资源管理器的列节点拖动表格,它会在查询窗口中为您放置一个 CSV 列列表
【讨论】:
【参考方案16】:如果您正在处理或解决一个非常长的过程,使用书签是保持理智的好方法。假设您正在使用外部查询中的派生字段,它的定义是内部查询中的另外 200 行。您可以为这两个位置添加书签,然后在两者之间快速来回切换。
【讨论】:
(@ptilton:如果您想在答案中添加一些信息,您应该评论或发布自己的答案而不是编辑)对于所有其他人:@ptilton 提到了以下(有用的)快捷方式书签:CTRL+K+K - 在编辑器的当前行创建/删除书签; CTRL+K+P-导航到上一个书签; CTRL+K+P-导航到下一个书签【参考方案17】:使用SELECT INTO
查询快速/轻松地制作备份表以供使用和试验。
【讨论】:
【参考方案18】:了解 SQL Server Management Studio 中可用的两种(?)不同类型的窗口。
如果您右键单击一个表格并选择Open
,它将使用一个可编辑的网格,您可以在其中修改单元格。如果您右键单击数据库并选择New Query
,它将创建一个稍微不同类型的窗口您无法修改其中的网格,但它为您提供了一些其他不错的功能,例如允许不同的代码 sn-ps 并让您通过选择单独执行它们。
【讨论】:
【参考方案19】:有助于提高我所做工作准确性的另一件事并不是真正的管理工作室技巧,而是使用 t-sql 本身。
每当我第一次编写更新或删除语句时,我都会在其中加入一个选择,以便查看哪些记录会受到影响。
例子:
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 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
从上面的示例中可以看出,如果您取消注释选择并忘记重新注释它,哎呀,您刚刚更新了整个表,然后在您想只运行更新时运行了一个选择。本周有人在我的办公室里这样做了,所以所有客户中只有一个人可以登录客户网站。所以避免这样做。
【讨论】:
【参考方案20】:我有一个计划任务,每天晚上将每个对象(表、存储过程等)写入文件。我在输出目录上设置了全文搜索索引,所以当我在寻找某个隐藏在 DB 中某处的字符串(例如常量)时,我可以很快找到它。
在 Management Studio 中,您可以使用 Tasks > Generate Scrips... 命令查看如何执行此操作。
【讨论】:
愿意分享该代码吗?看起来很简单......我们中的一些人是第一次学习 SSMS ;)【参考方案21】:如果您与开发人员一起工作,通常会得到一小段代码,这些代码被格式化为一长行代码,那么用于 SQL Server management Studio 的 sql pretty printer add-on 可能会对超过 60 多个格式化程序选项有很大帮助。 http://www.dpriver.com/sqlpp/ssmsaddin.html
【讨论】:
【参考方案22】:使用对象资源管理器详细信息而不是对象资源管理器来查看您的表格,这样您可以按一个字母并让它转到具有该字母前缀的第一个表格。
【讨论】:
【参考方案23】:子查询
对象资源管理器 > 右键单击表格 > 将表格编写为 > 选择到 > 剪贴板
然后您可以将其粘贴到您想要的部分作为子查询。
模板/片段
只使用代码 sn-p 创建您自己的模板。然后将模板作为新文档打开,只需将其拖到当前查询中即可插入 sn-p。
一个 sn-p 可以简单地是一组带有 cmets 的标头或只是一些简单的代码。
隐式交易
如果您不记得在删除语句之前启动事务,您可以转到选项并在所有查询中默认设置隐式事务。它们总是需要明确的提交/回滚。
隔离级别
转到选项并将隔离级别默认设置为 READ_UNCOMMITED。这样您就不需要在所有临时查询中键入 NOLOCK。只是不要忘记在编写新视图或存储过程时放置表格提示。
默认数据库
您的登录有一个由 DBA 设置的默认数据库(对我来说,几乎每次都是不想要的)。
如果您因为当前正在进行的项目而希望它是不同的。
在“注册服务器窗格”> 右键单击 > 属性 > 连接属性选项卡 > 连接到数据库。
多次登录
(这些你可能已经做过了)
多次注册服务器,每次使用不同的登录名。然后,您可以在对象浏览器中多次打开同一服务器(每次使用不同的登录名)。
要使用不同的登录名执行您已经编写的相同查询,而不是复制查询,只需右键单击查询窗格 > 连接 > 更改连接。
【讨论】:
【参考方案24】:我热烈推荐 Red Gate 的 SQL Prompt。自动发现(表、存储过程、函数和本机函数的智能感知)简直太棒了! :)
不过,它是有代价的。没有免费版本的东西。
【讨论】:
【参考方案25】:+1 表示 SQL 提示。
我想我从未见过的真正简单的东西 - 几乎适用于任何 SQL 环境(甚至其他语言):
经过 12 年的 SQL 编码,我最近在一些 SSMS 生成的代码中看到了逗号前缀样式,我发现它非常有效。我很惊讶我以前从未见过这种风格,尤其是因为它极大地提高了我的工作效率。
SELECT
t.a
,t.b
,t.c
,t.d
FROM t
它使编辑选择列表、参数列表、按列表排序、按列表分组等变得非常容易。我发现我花在在列表末尾添加和删除逗号上的时间少了很多在剪切和粘贴操作之后 - 我想它会更容易,因为你几乎总是在最后添加东西,并且使用后缀逗号,这需要你更多地移动光标。
试试吧,你会感到惊讶 - 我知道我是。
【讨论】:
这很有意义...对于大型列表。否则它只是丑陋且阅读起来有点棘手。 我几乎总是使用这种格式,这样在测试不同的结果集时可以很容易地注释掉列。我发现另一种有用的格式是在其包含的 sql 上方和下方保留 cte 的打开和关闭括号,以便我可以轻松选择这些行并按 F5,如果我只想查看 cte 结果 @Scot Hauder - 我也这样做,我认为它值得自己回答。【参考方案26】:我最喜欢的快速提示是,当您在对象资源管理器中展开表名时,只需将单词“colums”拖到查询屏幕即可将表中所有列的列表放入查询中。删除你不想要的比输入你想要的要容易得多,而且它非常简单,它可以防止人们使用真正糟糕的 select * 语法。它可以防止拼写错误。当然你也可以单独拖动列。
【讨论】:
【参考方案27】:利用 TRY/CATCH 功能捕获错误。
Adam Machanic 的 Expert SQL Server 2005 Programming 是提供可靠技术和实践的绝佳资源。
对存储过程使用所有权链接。
利用模式来强制数据安全和角色。
【讨论】:
【参考方案28】:尽量使用最小的数据类型,并索引查询中最常用的所有字段。
尽量避免使用服务器端游标。始终坚持使用“基于集合的方法”而不是“程序方法”来访问和操作数据。通常可以通过使用 SELECT 语句来避免游标。
始终使用查询分析器中的图形执行计划或 SHOWPLAN_TEXT 或 SHOWPLAN_ALL 命令来分析您的查询。确保您的查询执行“索引搜索”而不是“索引扫描”或“表扫描”。表扫描或索引扫描是一件非常糟糕的事情,应尽可能避免。在正确的列上选择正确的索引。 使用更易读的 ANSI 标准连接子句代替旧式连接。对于 ANSI 连接,WHERE 子句仅用于过滤数据。与旧式连接一样,WHERE 子句同时处理连接条件和过滤数据。
不要让您的前端应用程序直接使用 SELECT 或 INSERT/UPDATE/DELETE 语句查询/操作数据。相反,创建存储过程,并让您的应用程序访问这些存储过程。这使您的应用程序的所有模块的数据访问保持干净和一致,同时将业务逻辑集中在数据库中。
谈到存储过程,不要在存储过程名称前加上“sp_”。前缀 sp_ 保留用于 SQL Server 附带的系统存储过程。每当 SQL Server 遇到以 sp_ 开头的过程名称时,它首先尝试在 master 数据库中定位该过程,然后查找提供的任何限定符(数据库、所有者),然后尝试将 dbo 作为所有者。因此,您可以通过避免使用“sp_”前缀来真正节省定位存储过程的时间。
尽可能避免使用动态 SQL 语句。动态 SQL 往往比静态 SQL 慢,因为 SQL Server 每次运行时都必须生成一个执行计划。
如果可能,请尝试使用集成身份验证。这意味着,忘记 sa 和其他 SQL 用户,使用 microsoft 用户配置基础结构并始终保持您的 SQL 服务器与所有必需的补丁保持最新。 Microsoft 在开发、测试和发布补丁方面做得很好,但应用它是你的工作。
在 amazon.com 上搜索有好评的书籍并购买!
【讨论】:
感谢 VP 在这里提供了一些好的建议,但在我的问题中,我更多地研究了编写 TSQL 的不同方面,即关于如何提高编码本身速度而不是代码质量的技巧。质量显然更重要,但不是问题的主要范围。 也许我们可以添加一个“社区拥有的 wiki”类型的问题来解决您提到的那些更通用的准则【参考方案29】:看看Red Gate's SQL Prompt - 这是一款很棒的产品(Red Gate 的大部分贡献也是如此)
SQL Inform 也是一个很棒的免费(在线)工具,用于格式化有时会失控的长过程。
除此之外,我从痛苦的经历中了解到,在任何 DELETE
声明之前声明 BEGIN TRANSACTION
是件好事。一旦您确定您的声明只删除了它应该删除的内容,您就可以COMMIT
。
多次救了我 ;-)
【讨论】:
某些更新与删除一样具有破坏性,因为它们会销毁存储在特定(一组)列中的数据。【参考方案30】:我建议您为您的 SQL 脚本创建标准并坚持下去。还可以使用模板快速创建不同类型的存储过程和函数。这是关于 SQL Server 2005 Management Studio 中模板的问题
How do you create SQL Server 2005 stored procedure templates in SQL Server 2005 Management Studio?
【讨论】:
以上是关于SQL Server Management Studio – 改进 TSQL 编码过程的技巧的主要内容,如果未能解决你的问题,请参考以下文章
怎样使用SQL Server Management Studio
标题: Microsoft SQL Server Management Studio
使用 SQL Server Management Studio 连接到 SQL Server
如何在 SQL Server Management Studio 中注册 SQL Server 服务器?
SQL Server Compact Edition 和 SQL Server 2008 Management Studio