odbc 函数序列错误_SQL Server 2012 TSQL 新特性序列 Sequence

本文介绍了SQL Server 2012的新特性,包括序列 Sequence的创建与使用,与自增列的区别,以及序列的限制。同时,讨论了数据分页的改进方法,异常处理机制的增强,存储过程执行的优化,元数据函数的更新,以及SQL函数的扩展。这些新特性为SQL编程提供了更多便利。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

序列 Sequence

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

CREATE SEQUENCE DemoSequenceSTART WITH 1INCREMENT BY 1;

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

SELECT VALUE FOR DemoSequence

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

ALTER SEQUENCE Samples.IDLabelRESTART 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 TempTableWHERE sequencenumber > 10 and sequencenumber <= 20

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

SELECT *FROM CustomersORDER BY CustomerIDOFFSET 10 ROWSFETCH 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 TRANSACTIONEND TRYBEGIN 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 TRANSACTIONEND TRYBEGIN CATCH    -- There is an error    ROLLBACK TRANSACTION    -- Re throw the exception    THROWEND CATCH

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

存储过程执行改善 Execute Procedure Enhanced

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

SET FMTONLY ON;GOSELECT *    FROM  dbo.GBITEMGOSET 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_WithResultSetASBEGIN        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 ENDGOEXEC 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.TestProcASSELECT 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 TestProc2AS    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),才加入这些基础函数。

文章转载自:

https://www.cnblogs.com/JamesLi2015/p/3330326.html

文章经作者授权转载,版权归原文作者所有

图片来源于网络,侵权必删!

a16adffbc6c2fef93fe4376c8a5adb63.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值