SQL 11 (代号 Denali) 入门 - 第一部分 (CTP 1 中的 SSMS 功能)






4.93/5 (16投票s)
本文将从 SSMS 的角度探讨 Denali 为我们提供的新功能。
SQL 11 (代号 Denali) 入门 - 第一部分 (CTP 1 中的 SSMS 功能)
目录
引言
微软在技术领域最热门、最令人惊叹的开发之一于2010年11月8日面世,当时他们发布了 **SQL Server 2011(代号Denali)** 的社区技术预览1(CTP 1)版本。CTP1 提供32位和64位版本。
正如预期的那样,Denali为SQL爱好者(无论是开发人员、管理员还是商业智能(BI)专业人士)带来了一些新功能。在本系列中,我们将探讨SSMS的增强功能和新功能。其余的功能将在后续系列中介绍。
背景
在过去的几年里,微软为开发人员带来了许多新技术。随着SQL Server 2005(代号**Yukon**)的出现,SQL Server的术语发生了翻天覆地的变化,在随后的SQL Server 2008(代号**Katmai**)和SQL Server 2011(代号**Denali**)等版本中,通过引入新功能、增强功能和改进,保持了同样的步伐。
在本文中,我们将从SSMS的角度深入探讨Denali已经提供的新功能。后续文章将重点介绍TSQL、管理员和BI领域的增强功能。
安装
由于本文将重点介绍Denali的SSMS功能,因此,本文的范围不包括完整的安装说明。但是,请参考[文章](http://www.kodyaz.com/articles/how-to-install-sql-server-2011-installation-guide.aspx)进行安装。它提供了如何安装Denali、硬件和软件要求的详细方法。
启动屏幕
启动屏幕如下所示

登录服务器后,我们会看到用户界面屏幕

确保数据库兼容级别设置为SQL Server“Denali”(110)

SSMS 增强功能
SSMS现已与Visual Studio类似。以下是我们在SSMS增强方面将深入探讨的一些主要功能。
屏幕对象可以取消停靠,例如,下面的截图将显示取消停靠后的对象资源管理器



Denali的另一个有趣功能是循环剪贴板历史

我们可以使用Ctrl+Shift+V在剪贴板之间切换。此功能已在Visual Studio中可用,现在也已集成到Denali中。
一个小型功能,我们可以在其中添加任务并为其分配优先级。可以从**视图->任务列表**获得,或按**Ctrl+\,T**。任务列表窗口将如下所示:
我们可以按如下方式设置任务的优先级

任务完成后,我们可以勾选表示任务已完成的复选框。

又一个小的补充功能,它有助于基于可用的枚举值来缩放文本。默认值为100%。

序列的概念在Oracle中由来已久。然而,SQL Server 2011已将此功能包含在内。
那么,什么是序列?
它生成一系列数字,类似于SQL表中的标识列。但其优势在于它独立于表。
如何创建序列对象
可以通过两种方式创建序列
a) 无需T-SQL脚本
b) 使用T-SQL脚本
a) 无需T-SQL脚本创建序列
在对象资源管理器中,“可编程性”下有新的“序列”节点。

右键单击“序列”节点,然后单击“**新建序列…**”选项。

我们将看到“新建序列”屏幕。

像所有数据库对象一样,序列也有一个名称(此处为MySequence)并分配给数据库架构(dbo)。
如果展开“数据类型”下拉列表,我们将获得关于序列支持的数据类型的相关信息。

**起始值**是序列对象返回的第一个值。
**递增值**可以接受正数和负数。它用于递增(正值)或递减(负值)序列对象的值。
**最小值和最大值**是序列的边界。
如果启用**循环选项**,则可以重复使用序列号。否则,当序列值达到最大限制时,它将报告错误。
b) 使用T-SQL脚本创建序列
我们也可以使用T-SQL脚本创建序列。
创建序列的一般语法如下:
CREATE SEQUENCE [schema_name . ] sequence_name [ AS { built_in_integer_type | user-defined_integer_type } ] | START WITH <constant> | INCREMENT BY <constant> | { MINVALUE <constant> | NO MINVALUE } | { MAXVALUE <constant> | NO MAXVALUE } | { CYCLE | NO CYCLE } | { CACHE [<constant> ] | NO CACHE } </constant></constant></constant></constant></constant>
那么,让我们先创建一个序列,如下所示:
CREATE SEQUENCE GenerateNumberSequence START WITH 1 INCREMENT BY 1;
执行此语句后,在“序列”节点中,我们将看到已创建的序列对象。

序列对象到位后,接下来我们可以创建表并使用以下方式填充数据:
Create Table tblWithSequence1 ( EmpId int not null primary key ,EmpName varchar(50) not null ); Insert into tblWithSequence1(EmpId, EmpName) VALUES (NEXT VALUE FOR GenerateNumberSequence, 'Niladri'), (NEXT VALUE FOR GenerateNumberSequence, 'Deepak') SELECT * FROM tblWithSequence1;
Denali的序列与先前版本的标识列有何不同?
考虑以下在SQL Server 2008中编写的程序。只需创建一个带有两列的表,其中一列是标识列。
Create Table tblWithOutSequence1 ( EmpId int identity not null primary key ,EmpName varchar(50) not null ) Insert into tblWithOutSequence1 Select 'Niladri' Union All Select 'Deepak' Select * from tblWithOutSequence1
同样,创建具有相同架构的另一个表,如下所示:
Create Table tblWithOutSequence2 ( EmpId int identity not null primary key ,EmpName varchar(50) not null ) Insert into tblWithOutSequence2 Select 'Niladri' Union All Select 'Deepak' Select * from tblWithOutSequence2
标识方法的缺点
可以想象,在创建表时,我们被迫在两个表中都编写标识列,即我们无法重用一个表的`EmpId`列到另一个表中。
但是,序列可以帮助我们做到这一点。
Denali序列的应用
我们已经用序列**GenerateNumberSequence**填充了一个表(tblWithSequence1)。
同样,如果我们创建另一个表,例如tblWithSequence2,我们可以轻松地使用**GenerateNumberSequence**,如下所示:
Create Table tblWithSequence2 ( EmpId int not null primary key ,EmpName varchar(50) not null ); Insert into tblWithSequence2(EmpId, EmpName) VALUES (NEXT VALUE FOR GenerateNumberSequence, 'Niladri'), (NEXT VALUE FOR GenerateNumberSequence, 'Deepak') SELECT * FROM tblWithSequence2;
**注意:**序列对象可以与表变量或临时表一起使用。
如果我们查看上面的序列程序,我们可以发现,对于每一行的插入,我们都使用`Next Value For`语句从序列中获取一个数字。然而,如果我们想获取一系列序列号,我们可以使用**sp_sequence_get_range**。
删除序列
由于序列是数据库对象,因此可以删除它。如果我们想删除一个序列,我们可以执行:
Drop Sequence GenerateNumberSequence
**注意:**在本文的第一部分,我提供了序列的基本介绍。下一部分将进行详细介绍。
此功能有助于T-SQL程序员将SQL语句块用IF语句、WHILE循环块或Begin...End块包围。

假设我们有如下代码:
Declare @i int set @i = 0 print @i set @i += 1
现在,如果我们想将上述程序转换为while循环,我们可以利用“环绕”功能,而不是手动编写。
**第一步:**选择将进入While块的部分。

**第二步:**右键单击,然后从弹出菜单中选择“**环绕”或按Ctrl+K, Ctrl+S**。

**第三步:**双击“While”代码片段,将生成以下代码:

我们只需要指定条件即可运行程序。太棒了!!!!
最后但同样重要的是,我们将在本文中介绍的代码片段;这是从Visual Studio借用的另一个功能。
代码片段允许我们快速地将代码模板插入到查询窗口中,以执行一些常见的T-SQL任务。
代码片段可以通过**编辑->IntelliSense->插入代码片段**或使用键盘快捷键**Ctrl+K, Ctrl+X**来调用。

如果我们想插入一个内联表,只需双击“表”代码片段,如下所示:

代码片段将被生成:

创建自定义代码片段
除了内置代码片段,我们还可以创建自己的自定义代码片段。
在这里,我们将创建一个自定义代码片段来创建**[序列对象](#5.5)**。
以下是创建自定义代码片段的步骤:
步骤1:创建代码片段文件并保存
作为初始步骤,我们需要创建一个`.snippet`文件,它本质上是一个具有预定义架构的XML文件。因此,我们的代码片段文件如下所示:
<?xml version="1.0" encoding="utf-8"?> <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <CodeSnippet Format="1.0.0"> <Header> <SnippetTypes> <SnippetType>Expansion</SnippetType> </SnippetTypes> <Title>Sequence</Title> <Author>Niladri Biswas</Author> <Description>Code snippet for Sequence Creation</Description> <HelpUrl>http://msdn.microsoft.com/en-us/library/ff878091(v=sql.110).aspx</HelpUrl> <Shortcut></Shortcut> </Header> <Snippet> <Code Language="sql"> <![CDATA[ CREATE SEQUENCE Sample_Sequence START WITH 1 INCREMENT BY 1 MINVALUE -2147483648 MAXVALUE 2147483647 ]]> </Code> </Snippet> </CodeSnippet> </CodeSnippets>
将其保存在某个文件夹中,并将其命名为**CustomSequence.snippet**(请注意文件扩展名为`.snippet`),例如保存在名为**CustomSequence**的文件夹中。在本例中,完整路径为**C:\CustomSequence\CustomSequence.snippet**。
步骤2:在代码片段管理器中注册自定义代码片段
在SSMS中,选择**工具->代码片段管理器**,或调用快捷键**Ctrl+K, Ctrl+B**。代码片段管理器窗口将打开。

单击**添加…**按钮,然后选择已生成**CustomSequence.snippet**文件的文件夹(此处为**CustomSequence**)。在这种情况下,它将是**C:\CustomSequence**。
可以看到,文件夹已添加。单击“确定”。
步骤3:调用代码片段
我们可以通过**工具->代码片段管理器**或使用快捷键**Ctrl+K, Ctrl+B**来调用代码片段。

双击“序列”,将在查询编辑器中生成如下代码片段:
CREATE SEQUENCE Sample_Sequence START WITH 1 INCREMENT BY 1 MINVALUE -2147483648 MAXVALUE 2147483647
**注意:**在代码片段管理器中,有一个“导入”按钮,它基本上导入代码片段文件而不是文件夹。

与其手动在基于XML的`.snippet`文件中编写代码片段,不如使用Code Plex中的[Snippet Designer](http://snippetdesigner.codeplex.com/)。
这是一个用于生成代码片段的优秀工具。
参考文献
结论
Denali 为我们带来了很多东西。我们讨论的功能只是CTP1中提供的一些强大功能。在CTP2中,他们将引入**Juneau**,用于在SQL Azure和SSMS之间实现应用程序开发的统一。在[下一系列](Denali_Tsql_Part_2.aspx)中,我们将介绍Denali CTP1中新增强的TSQL功能。敬请关注并分享您对本文的看法。