序列 Sequence

SQL Server 现在将序列当成一个对象来实现,创建一个序列的例子语法如下:

CREATE SEQUENCE DemoSequence
START WITH 1
INCREMENT BY 1;

使用序列的方法如下所表达的:

SELECT VALUE FOR DemoSequence

序列与以前的种子列(identity)的区别很明显,种子列只限于当前列,而序列是一个对象层面的实现,则可以在多个表之间共享。这一点特点在管理软件序列号生成方面,是个不错的开始。和种子列相似,序列也可以重置,例子如下

ALTER SEQUENCE Samples.IDLabel
RESTART WITH 1 ;

序列的值可以使用整型类型,比如tinyint, smallint, int, bigint, decimal 或是小数精度为0的数值类型。

序列的限制(limitation)有二个,一是序列不支持事务,即使事务中进行了回滚(rollback)操作,序列仍然返回下一个元素。

第二,序列不支持SQL Server 复制(replication),序列不会复制到订阅的SQL Server实例中。如果一个表的默认值依赖一个序列,而序列又是不可复制的,这会导致订阅的SQL Server出现脚本错误。

数据分页 Page Data

SQL Server一直在改善数据分页方法,SQL Server 2005内置的row_number函数可以实现,例子代码如下

SELECT *
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY CustomerID) AS sequencenumber, *
FROM Customers) AS TempTable
WHERE sequencenumber > 10 and sequencenumber <= 20

SQL Server 2012有更简洁的语法,例子代码如下所示

SELECT *
FROM Customers
ORDER BY CustomerID
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;

依据客户编号排序,跳过前面10笔记录,取第10笔记录。这很像Linq中的Skip.Take,Linq语法例子如下

var customers=customerList.Skip(10).Take(10);

异常处理 Exception Handling

SQL Server 2005引入了类似于.NET语言的异常处理机制到T-SQL代码中,请参考下面的例子

BEGIN TRY
BEGIN TRANSACTION – Start the transaction -- Delete the Customer
DELETE FROM Customers
WHERE EmployeeID = ‘CACTU’ -- Commit the change
COMMIT TRANSACTION
END TRY
BEGIN CATCH
-- There is an error
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION -- Raise an error with the details of the exception
DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY() RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH

如果在catch语句块中捕获了异常,只能引用RaiseError函数来继续抛出异常。新版本的SQL Server引入了throw关键字,可取代RaiseError函数的作用。参考代码如下

BEGIN TRY
BEGIN TRANSACTION -- Start the transaction -- Delete the Customer
DELETE FROM Customers
WHERE EmployeeID = ‘CACTU’ -- Commit the change
COMMIT TRANSACTION
END TRY
BEGIN CATCH
-- There is an error
ROLLBACK TRANSACTION -- Re throw the exception
THROW
END CATCH

异常处理机制的一个好处是N层回滚(rollback),抛出异常的程序,逐层向上寻找,直到找到处理异常的代码。

存储过程执行改善 Execute Procedure Enhanced

在旧的SQL Server版本中,要返回一个查询语句的列信息,可以使用SET FMTONLY语句,它返回结果列,而不是实际的数据,请参考运行下面的语句:

SET FMTONLY ON;
GO
SELECT * FROM dbo.GBITEM
GO
SET FMTONLY OFF;

存储过程是一个预编译的批处理语句块,预编译可改善性能,前一个版本的SQL Server应用关键字(WITH RECOMPILE) 可以强制重新编译存储过程,生成新的执行计划。新版本的SQL Server改善了查询结果的返回信息,可以对存储过程的查询结果,进行别名字义。下面的代码,重新定义存储过程的返回列信息:

EXEC CustOrderDetail ‘2’
WITH RESULT SETS
(
(
ProductName1 varchar(100),
Unitprice1 varchar(100),
Quantity1 varchar(100),
Discount1 varchar(100),
ExtendedPrice1 varchar(100)
)
);

Exec的参数With Results Set可以依据存储过程的实际返回结果,重新定义返回的列名或类型。参考下面的SQL语句:

CREATE PROCEDURE Denali_WithResultSet
AS
BEGIN
SELECT 1 as No,’Tsql’ Type, ‘WithResultSet’ AS Feature UNION ALL
SELECT 2 as No,’Tsql’ Type, ‘Throw’ AS Feature UNION ALL
SELECT 3 as No,’Tsql’ Type, ‘Offset’ AS Feature UNION ALL
SELECT 4 as No,’Tsql’ Type, ‘Sequence’ AS Feature
END
GO
EXEC Denali_WithResultSet
WITH RESULT SETS
(
( No int,
FeatureType varchar(50),
FeatureName varchar(50)
)
)
 

上面的代码演示了如何运用with result set来修改存储过程的返回列名称。这个特性与第三方的工具集成,比如SSIS任务,报表中会有一定的改善作用。

元数据函数 Metadata Function

新版本的SQL Server增加了几个存储过程用于获取SQL Server 对象的元数据,比如下面的SQL语句:

EXEC sp_describe_first_result_set @tsql=N'SELECT * FROM gbitem'

它会返回表gbitem的每一列的元数据信息,比如列名,是否可空,数据类型,排序等数据信息。

下面的例子演示了如何应用上面提到的函数,返回存储过程的元数据:

CREATE PROC Production.TestProc
AS
SELECT Name, ProductID, Color FROM Production.Product ;
SELECT Name, SafetyStockLevel, SellStartDate FROM Production.Product ;
GO SELECT * FROM sys.dm_exec_describe_first_result_set
('Production.TestProc', NULL, 0) ;

此函数还可以返回多个SQL批处理查询的元数据信息,请参考下面的例子代码

SELECT * FROM sys.dm_exec_describe_first_result_set(
N'SELECT CustomerID, TerritoryID, AccountNumber FROM Sales.Customer WHERE CustomerID = @CustomerID;
SELECT * FROM Sales.SalesOrderHeader;',
N'@CustomerID int', 0) AS a;
GO

如果一个存储过程想返回多笔记录集,在旧版本的SQL Server中,只能获取最后一次返回的记录集。新版本的SQL Server对此作出一些改善,可以指定要返回的记录集。

CREATE PROC TestProc2
AS
SELECT object_id, name FROM sys.objects ;
SELECT name, schema_id, create_date FROM sys.objects ;
GO SELECT * FROM sys.dm_exec_describe_first_result_set_for_object(OBJECT_ID('TestProc2'), 0) ;
SELECT * FROM sys.dm_exec_describe_first_result_set_for_object(OBJECT_ID('TestProc2'), 1) ;
GO

这个特性会给程序处理上带来很多便利,为返回二个结果集而不必定义二个重复的存储过程,而仅仅是返回的结果不同。

SQL 函数 SQL Function

新版本的SQL Server增加了很多函数,请参考园友的文章SQL Server 2012新增的内置函数尝试

这些函数的到来,可以给SQL编程带来便利性。不过,我以为自从SQL Server 2005引入了CLR,实现这些函数都相当容易,直接对.NET BCL一层简单的封装即可,不知道为何过了二个重要的版本后(SQL Server 2008,SQL Server 2008 R2),才加入这些基础函数。

关于SQL Server 2012 T-SQL方面更多的特性,请参考这里:

http://dattatreysindol.com/2012/07/30/sql-server-2012-transact-sql-enhancements-learning-resources/

SQL Server 2012 T-SQL 新特性的更多相关文章

  1. SQL Server 2012 实现分页新语法

    最近一直在看SQL Server的书,不过看的都是基础的查询流,查询在工作中用到的最多,所以能正确地查询出想要的数据也是很重要的嘛. 在书上看到在SQL Server 2012新增了一种实现分页的查询 ...

  2. [转]SQL Server 2012 的 T-SQL 新功能 – 新的数据分析函数(LEAD、LAG)

    当您需要在 SQL Server 中利用 T-SQL 比较结果集的每一列跟前一列或后一列的差异时,在过去可能需要利用 CURSOR 搭配临时表变量,或是透过递归 CTE 来达到这个效果,如今 SQL ...

  3. SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第1部分)

    为了缩小读取操作所涉及范围,本文首先着眼于简单的SELECT查询,然后引入执行更新操作有关的附加过程.最后你会读到,优化性能时SQLServer使用还原工具的相关术语和流程. 关系和存储引擎 如图所示 ...

  4. SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第2部分)

    计划缓存(Plan Cache) 如果SQL Server已经找到一个好的方式去执行一段代码时,应该把它作为随后的请求重用,因为生成执行计划是耗费时间且资源密集的,这样做是有有意义的. 如果没找到被缓 ...

  5. SQL Sever 各版本下载 SQL Server 2012下载SQL Server 2008下载SQL Server 2005

    SQL Server 2012SQL Server 2012 开发版(DVD)(X64,X86)(中文简体)ed2k://|file|cn_sql_server_2012_developer_edit ...

  6. sql server 2012 导出sql文件

    导出表数据和表结构sql文件 在工作中,经常需要导出某个数据库中,某些表数据:或者,需要对某个表的结构,数据进行修改的时候,就需要在数据库中导出表的sql结构,包括该表的建表语句和数据存储语句!在这个 ...

  7. SQL Server 2012:SQL Server体系结构——一个查询的生命周期(第3部分)(完结)

    一个简单的更新查询 现在应该知道只读取数据的查询生命周期,下一步来认定当你需要更新数据时会发生什么.这个部分通过看一个简单的UPDATE查询,修改刚才例子里读取的数据,来回答. 庆幸的是,直到存取方法 ...

  8. SQL Server 2012 - 动态SQL查询

    动态SQL的两种执行方式:EXEC @sql 和 EXEC sys.sp_executesql @sql DECLARE @c_ids VARCHAR(200) SET @c_ids ='1,2' - ...

  9. SQL SERVER 2012 从Enterprise Evaluation Edtion 升级到 Standard Edtion SP1

    案例背景:公司从意大利购买了一套中控系统,前期我也没有参与其中(包括安装.实施都是第三方),直到最近项目负责人告诉我:前期谈判以为是数据库的License费用包含在合同中,现在经过确认SQL Serv ...

  10. Win7 安装SQL SERVER 2012需要SP1补丁

    在操作系统Win7上安装SQL Server 2012时,报如下错误: 也就是说SQL Server 2012如要要安装在Windows 7 上,则至少需要安装SP1补丁.否则就会弹出上面提示信息.关 ...

随机推荐

  1. 我看见的第一个XCODE编译错误 - Command /applications.../clang failed with exit code 1

    开始用XCODE学习Apple相关开发的东东,写些demo熟悉Object C,一直还没看见什么问题,昨晚在家把一些demo上传到代码服务器,今天在另外一台机器上下载下来编译,出现了问题: Preco ...

  2. 『TCP/IP详解——卷一:协议』读书笔记——14

    2013-08-25 11:32:06 第5章 RARP:逆地址解析协议 5.1 引言 具有本地磁盘的系统引导时,一般是从磁盘上的配置文件中读取IP地址.但是无盘机,如X终端或无盘工作站,则需要采用其 ...

  3. XCode一直显示"scanning for working copies"的解决办法

    一个SVN上的项目,在本地重新CheckOut打开后,一直提示"scanning for working copies"且不能使用SVN的更新.提交等功能,当时想着晾它一晚上,看能 ...

  4. [UE4]Animation Techniques used in Paragon部分翻译及索引

    视频地址:https://www.youtube.com/watch?v=1UOY-FMm-xo 主要内容:该视频由Paragon游戏制作者Laurent Delayen(Senior Program ...

  5. ‘ant-version’不是内部或外部命令,也不是可运行的程序

    下载apache-ant-1.9.2-bin.zip后,解压目录:F:\selenium\apache-ant-1.9.2 配置环境变量,在“我的电脑->属性->高级->环境变量 - ...

  6. map 遍历

    //最常规的一种遍历方法,最常规就是最常用的,虽然不复杂,但很重要,这是我们最熟悉的,就不多说了!! public static void work(Map<String, Student> ...

  7. 改变html中鼠标形状

    要修改的属性是: style=”cursor:default” 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 pointer:是手型. crosshair:是十字 ...

  8. jquery ajax post 中文乱码解决

    jquery ajax post 方式默认传递的是UFT-8字符,即使页面设置了gbk编码也无效.字符传到后台时如果后台设置的gbk或者其他编码,就会出现乱码.解决很容易,将后台页面设置成UTF-8编 ...

  9. Dubbo框架选型

    一.为什么会是dubbo 1.Dubbo是一个分布式服务框架,提供RPC(远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.) 远程服务调用方案,以及SOA ...

  10. Yii2中的环境配置

    默认的Debug配置 在入口文件中 defined ( 'YII_DEBUG' ) or define ( 'YII_DEBUG', true ); defined ( 'YII_ENV' ) or ...