SQL Server 2012 T-SQL 新特性

原文: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 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/

原文地址:https://www.cnblogs.com/lonelyxmas/p/9430771.html

时间: 2024-08-25 03:11:55

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

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

原文:SQL Server 2012:SQL Server体系结构--一个查询的生命周期(第3部分)(完结) 一个简单的更新查询 现在应该知道只读取数据的查询生命周期,下一步来认定当你需要更新数据时会发生什么.这个部分通过看一个简单的UPDATE查询,修改刚才例子里读取的数据,来回答. 庆幸的是,直到存取方法(Access Methods)前,更新操作和刚才SELECT语句流程是一模一样的. 这次存取方法(Access Methods)需要修改数据,因此在I/O请求传递前,修改的细节要存放于硬盘

SQL Server 2012 实现分页新语法

最近一直在看SQL Server的书,不过看的都是基础的查询流,查询在工作中用到的最多,所以能正确地查询出想要的数据也是很重要的嘛. 在书上看到在SQL Server 2012新增了一种实现分页的查询方法,感觉比原来的方便一点,因此记录一下,如能帮助到大家,也是非常开心的~ 以前分页的时候,我基本都是用ROW_NUMBER()函数,和在WHERE语句中用BETWEEN AND 来实现的:每次都得写子查询,感觉挺麻烦的,例: SELECT * FROM ( SELECT ID, ROW_NUMBE

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

为了缩小读取操作所涉及范围,本文首先着眼于简单的SELECT查询,然后引入执行更新操作有关的附加过程.最后你会读到,优化性能时SQLServer使用还原工具的相关术语和流程. 关系和存储引擎 如图所示,SQL Server被分为2个主要引擎:关系引擎和存储引擎.关系引擎有时也被称为查询处理器,因为它的主要功能是查询优化和执行.它包含检查查询语法和准备查询树的命令解析器:查询优化器毫无疑问是任何数据库系统中皇冠上的宝石:查询执行器对执行(查询计划)负责. 存储引擎对所有数据输入.输出管理负责.它包

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

计划缓存(Plan Cache) 如果SQL Server已经找到一个好的方式去执行一段代码时,应该把它作为随后的请求重用,因为生成执行计划是耗费时间且资源密集的,这样做是有有意义的. 如果没找到被缓存的计划,然后命令分析器(Command Parser)在T-SQL基础上生成一个查询树(query tree).查询树(query tree)的内部结构是通过树上的每个结点代表查询中需要的执行操作.这个树然后被传给查询优化器(Query Optimizer)去处理.我们的简单查询没有一个存在的计划

sql server 2012 打开sql server configuration manager 报错

Error message when you open SQL Server Configuration Manager in SQL Server: "Cannot connect to WMI provider. You do not have permission or the server is unreachable" Workaround解决办法 To work around this problem, open a command prompt, type the fol

SQL Server 2012 Express LocalDB

微软最新推出的 SQL Server 2012 Express LocalDB 是一种 SQL Server Express 的运行模式,特别适合用在开发环境使用,也内置在 Visual Studio 2012 之中. 关于 SQL Server 2012 Express LocalDB 的运作方式 在安装 LocalDB 时会复制一个 SQL Server Express 实例所需的最少文件,基本上 LocalDB 几乎等同于完整的 SQL Server Express 数据库引擎,且 Loc

安装 SQL Server 2012 的硬件和软件要求(官方全面)

以下各节列出了安装和运行 SQL Server 2012 的最低硬件和软件要求. Hardware and Software Requirements (PowerPivot for SharePoint and Reporting Services in SharePoint Mode).' data-guid="ac62f277a77cf0fe4624123fb93d4313">有关 SharePoint 集成模式下 Analysis Services 的要求的详细信息,请参

SQL Server 2012 Express LocalDB 的作用

微软最新推出的 SQL Server 2012 Express LocalDB 是一种 SQL Server Express 的运行模式,特别适合用在开发环境使用,也内置在 Visual Studio 2012 之中. 关于 SQL Server 2012 Express LocalDB 的运作方式 在安装 LocalDB 时会复制一个 SQL Server Express 实例所需的最少文件,基本上 LocalDB 几乎等同于完整的 SQL Server Express 数据库引擎,且 Loc

血泪经验分享---&gt;SQL Server 2012建立链接服务器

现在我有一个需求是需要在两个不同的SQL SERVER 2012的服务器之间进行数据访问和更新.我们需要把Server One的数据插入到Server Two的服务器上去,一天执行一次任务.我们的首选方案是在两个服务器之间建立链接服务器,下面介绍下如何建立链接服务器. 我需要做的事情是,我需要定时的全量的把Server one的数据插入到Server Two里去.所以这里就涉及到需要把Server Two里的表的信息做删除操作,由于我们都知道delete表是需要记录日志,他是为了回滚用的.所以要