SQL Server 2012 T-SQL 新特性
序列 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 TRYBEGIN TRANSACTION – Start the transaction-- Delete the CustomerDELETE FROM CustomersWHERE EmployeeID = ‘CACTU’-- Commit the changeCOMMIT TRANSACTION
END TRY
BEGIN CATCH-- There is an errorIF @@TRANCOUNT > 0ROLLBACK TRANSACTION-- Raise an error with the details of the exceptionDECLARE @ErrMsg nvarchar(4000), @ErrSeverity intSELECT @ErrMsg = ERROR_MESSAGE(),@ErrSeverity = ERROR_SEVERITY()RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
如果在catch语句块中捕获了异常,只能引用RaiseError函数来继续抛出异常。新版本的SQL Server引入了throw关键字,可取代RaiseError函数的作用。参考代码如下
BEGIN TRYBEGIN TRANSACTION -- Start the transaction-- Delete the CustomerDELETE FROM CustomersWHERE EmployeeID = ‘CACTU’-- Commit the changeCOMMIT TRANSACTION
END TRY
BEGIN CATCH-- There is an errorROLLBACK TRANSACTION-- Re throw the exceptionTHROW
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 ALLSELECT 2 as No,’Tsql’ Type, ‘Throw’ AS Feature UNION ALLSELECT 3 as No,’Tsql’ Type, ‘Offset’ AS Feature UNION ALLSELECT 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 ;
GOSELECT * 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 ;
GOSELECT * 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/
转载于:https://www.cnblogs.com/lonelyxmas/p/9430771.html
SQL Server 2012 T-SQL 新特性相关推荐
- SQL Sever 各版本下载 SQL Server 2012下载SQL Server 2008下载SQL Server 2005 下
SQL Sever 各版本下载 SQL Server 2012下载SQL Server 2008下载SQL Server 2005 下载SQL Server 2000 下载 SQL Server 20 ...
- SQL Server 2019 (15.x) 新特性概要
2019.11.4 SQL Server 2019发布,趁热打铁了解下2019的新特性.下面整理一些个人感觉重要的或者工作上能用到的新特性,有删减,完整版参考 SQL Server 2019 中的新增 ...
- SQL Sever 各版本下载 SQL Server 2012下载SQL Server 2008下载SQL Server 2005 下载SQL Server 2000 下载...
SQL Server 2016简体中文企业版 文件名:cn_sql_server_2016_enterprise 64位下载地址:ed2k://|file|cn_sql_server_2016_ent ...
- SQL Server 2012 随时随地管理数据
2012年3月7日消息,微软宣布全球应用最广泛的数据平台的最新版,Microsoft SQL Server 2012发布RTM版本(投入量产).SQL Server 2012能够把数据快速转化为切实可 ...
- sql数据库服务器端口修改,SQL SERVER 2012更改默认的端口号为1772
打开开始菜单,找到sqlserver的配置管理器,点击打开 按下图配置右边窗口三项: 按下图配置右边三项: 按下图配置右边三项: 点击下图左边的SQL Server网络配置/MSSQLSERVER的协 ...
- sql2008和2012区别_SQL server 2008 和SQL server 2012 的优势
SQL server 2008 和SQL server 2012 的优势 SQL server 数据库有SQL server 2008.SQL server 2012.SQL server 2014. ...
- SharePoint 2010 与 SQL Server 2012 报表服务集成
一.安装报表服务外接程序 SharePoint产品准备工具可以安装 Reporting Services 外接程序的 SQL Server 2008 R2 版本.SQL Server 2012 包括 ...
- SQL Server 2012 Express LocalDB
微软最新推出的 SQL Server 2012 Express LocalDB 是一种 SQL Server Express 的运行模式,特别适合用在开发环境使用,也内置在 Visual Studio ...
- 整合SQL Server 2012和2014
(For now we are not going to discuss how this can be implemented with SQL Server 2008 or SQL Server ...
- SQL Server 2012介绍
SQL Server 2012介绍 1.SQL Server 2012的新功能 作为SQL Server最新的版本,SQL Server 2012具有以下激动人心的新功能. (1)AlwaysOn. ...
最新文章
- Apache的工作原理
- 我们正处于新科学革命的起点 | 学界热议AI for Science
- 【Java Web前端开发】web概念概述和HTML基础部分
- bzoj 2705: [SDOI2012]Longge的问题——欧拉定理
- 关于vue打包的问题
- 吴思涵国内首场肿瘤ecDNA学术报告|深度揭秘半个世纪ecDNA的研究成果及突破性进展...
- kafka专题:kafka的总控制器Controller、消费者重分配策略等核心设计原理详解
- Git 存在多个漏洞,开发人员应及时更新
- iOS直播集成和问题总结(阿里云直播)
- php修改sessiob时间_php中session过期时间设置
- (转)利用个人电脑搭建网站WEB服务器域名访问
- VirtualBox 扩展win7虚拟硬盘容量
- Android Studio|简单记事本开发
- Macbook reset PRAM
- python excel写入日期变数字_RPA-使用Python读取Excel日期结果为数字时的转换处理方法...
- 【运筹帷幄】网站打开慢故障排查思路
- python画气泡图_用python 来绘制气泡图的简单技巧
- xpath中的position()函数使用
- PTA 1107 老鼠爱大米(C++实现)
- python agg函数_个人对Pandas中agg、apply和transform函数的理解