某天早晨,我问一个程序员:“如果你接受了一个修改一个存储过程的任务,那么你会如何一步步的完成这个工作"?他的回答是:“先启动vss,找到这个文件,然后用‘查询分析器’修改,调试,然后提交”。
都是些什么阿猫阿狗的啊。vss就不怎么样了,用它来定位文件是很麻烦的。通过查询分析器修改sql也很老套。并且这个工具没有代码提示,没有重构支持,也没有TDD!sql开发是应用开发的不可或缺的一部分,和它起到的作用相比,来自业界对sql的支持是非常不够的。尤其是缺乏一个高效率的IDE。
b. sql 语言终于升舱了
幸运的是,这样的日子就要结束了。VS2010的推出让sql可以享受如同C#的IDE了。微软这几年非常喜欢提一个组合词 first-class(头等舱)——如果把VS2010当成飞机的话,那么坐在头等舱的,确定是C#无疑。VS2010的推出,新增加了两个头等舱乘客——F#,SQL。是的,还有SQL语言。就是说,SQL 不必在和什么查询分析器,SQL PROMPTOR,甚至notepad这些鸡零狗碎的软件打交道了。
c. 具体特性
IDE 能够给我们带来什么?不外乎是 deploy 、project navigator、refactor、Intellisense 、TDD。采用VS2010,这些都有了。要大气!
现在SQL 可以如同C#那样,有工程文件了。工程文件是很多年前的概念了,它把离散的文件组合到一起。这样,典型的一个应用产品,就会有两个工程文件,应用程序工程,数据库工程(Database Project)。两者工程构成解决方案文件(solution)。即使没有采用c#等dotnet语言开发,比如delphi,也可以从vs2010的Database Project获益。因为Database Project和应用语言无关,仅仅和SQL语言有关。只要是开发存储过程、表、视图、函数等都可以用。好像SQL 2005 Management Studio 也有工程文件。不过有了vs2010 ,何必用这样的为开发者充门面的东西呢,SQL 2005 Management Studio是DBA用的。开发者要用 vs2010。采用Database Project也不必从头开始。 创建了Database Project后,VS2010可以Import script,或者Import from Database——保护现有的开发资源嘛。
Intellisense 代码提示也是Ok了。什么表,存储过程和函数以及它们的参数都是可以提示的。重构虽然不多,但是可以做rename,这是最常用的重构了。比这更好的,refactor会有一个日志记录叫做refactor log,通过它可以更好的自动发布。鉴于发布是比较复杂和强大的,因为会另外说明。
要修改文件,首先要找到文件,利用ide的查找文件必须要快——不能在这些枝节的工作上浪费时间。查找文件到底有多重要?可以说很多人没有dpack的alt+U,连程序都不想写了。dpack是Visual studio的一个文件查找插件,alt+U是查找文件的快捷键。现在VS2010可以继续使用dpack来做文件查找。当然内置的查找也有增强。
Schema comparor/data comparor 也做的不错。可以对数据库和Database Project之间做 结构和数据对比,查看差异。
d. 我认为还有一个令人兴奋的特性——数据库的声明型升级。注意我的用词是“兴奋”。这2年来让我兴奋的软件技术不多,比如everything这个小工具软件让我兴奋,现在"声明型数据库升级"是第二个。所谓的“声明型升级”,就是说,我告诉工具,升级前数据库是什么样子,升级后的数据库是什么样子,然后中间需要做什么样的修改,由工具搞定。和声明型升级对应的是过程型升级——告诉工具,应该如何一步步的从现在的数据库变成新的数据库。我在2003年曾经考虑过这个声明型升级的做法,但是种种原因,没有做到。前面提到,因为比较复杂,专文说明。
e. 应用和代价
可以在需要数据库开发的项目中使用,不管是c/s,还是b/s,反正需要数据库开发的,都可以用。代价是现在的电脑恐怕很多需要换掉——vs2010吃内存,吃CPU周期啊。
f. 支持 Sql Server 2000 吗?
看起来:vs2010并不支持sql2000的工程模板,仅仅支持2005,2008。
直接改数据库为sql2000的,deploy会报错:说明需要一个对应版本的DatabaseSchemaProvider 。
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\TeamData\Microsoft.Data.Schema.TSqlTasks.targets(120,5): Error Deploy01234: The source database schema provider Sql100DatabaseSchemaProvider could not be translated to provider Sql80DatabaseSchemaProvider. Deployment cannot continue.
vs2008可以支持sql2000,但是仅仅作为sql的容器,而在vs2010才有了 Intellisense, build-time validation, automatic deployment 。