在 Transact-SQL 中运用 TENVISIONY…CATCH

在 Transact-SQL 中运用 TENVISIONY…CATCH

目录

摘要 本文是参照相关资料总括的一篇有关T-SQL语言编制程序规范的稿子,目的在于为须要那上头资料的IT公司设计开发人士提供3个参照。
来源:

1. 
概述
一.一.
中坚尺度
以大小写敏感编写SQL语句。
尽心尽力采用Unicode 数据类型。
事先选拔连接代替子查询或嵌套查询。
尽大概选择参数化SQL查询代替语句拼接SQL查询。
明令禁止行使[拼音]+[英语]的方法来定名SQL对象或变量。
尽恐怕使用存款和储蓄进度代替SQL语句。

(注:本文来源于
http://msdn.microsoft.com/zh-cn/library/ms179296.aspx)

  • 1.用到Transact-SQL语言编制程序
    • 一.一.多少定义语言DDL
    • 一.贰.数量操纵语言DML
    • 一.3.数目控制语言DCL
    • 壹.四.Transact-SQL言语功底
  • 2.运算符
    • 2.一.算数运算符
    • 2.二.赋值运算符
    • 贰.3.位运算符
    • 贰.肆.相比运算符
    • 二.5.逻辑运算符
    • 二.6.连接运算符
    • 贰.七.1元运算符
    • 二.八.运算符的事先级
  • 三.控制语句
    • 3.1.BEGIN
      END语句块
    • 3.2.IF
      ELSE语句块
    • 三.3.CASE分支语句
    • 3.4.WHILE语句
    • 三.5.WAITFOQashqai延缓语句
    • 3.陆.RETUCRUISERN无条件退出语句
    • 叁.7.GOTO跳转语句
    • 叁.八.T福特ExplorerY
      CATCH错误处理语句
  • 四.常用函数
    • 四.一.数据类型转换函数

概述

一.贰.
基本标准
提出使用帕斯Carl样式或Camel样式命名数据库对象。
大写T-SQL语言的兼具重点字,谓词和种类函数。

 

1.施用Transact-SQL语言编制程序

固然SQL Server
二零一零提供了图形化界面,但唯有壹种Transact-SQL语言能够直接与数据库引擎进行相互。依据实施效果特色能够将Transact-SQL语言分成三大类:数据定义语言DDL,数据操纵语言DML,数据控制语言DCL。

壹.一.骨干尺度

以大小写敏感编写SQL语句。

尽量使用Unicode
数据类型。

先期使用连接代替子查询或嵌套查询。

尽心尽力使用参数化SQL查询代替语句拼接SQL查询。

取缔行使[拼音]+[英语]的秘籍来命名SQL对象或变量。

尽心尽力选取存款和储蓄进度代替SQL语句。

2. 
命名规范
在一般景色下,采取帕斯Carl样式或Camel样式命名数据库对象,使在支付基于数据库应用程序的时候经过OCR-VM工具生成的多寡访问代码不必要调整就适合程序支付语言(比如C#)命名规范。别的,关系型数据库同Xml结合得越来越紧凑,规范的命名越来越首要。
在实质上数据库开发进度中,假如供给方已经提供数据库设计方案,提议以提供的方案为准;在原来数据库上进展升级换代开发时,在有效的景色下可适量做出规划调整以适合编制程序规范。

            SQL Server 2008 R2     

一.壹.数额定义语言DDL

是最基础的Transact-SQL语言类型,用来创建数据库和开创,修改,删除数据库中的各样对象,为此外语言的操作提供对象。例如数据库,表,触发器,存款和储蓄进度,视图,函数,索引,类型及用户等都以数据库中的对象。常见的DDL语句包含

CREATE TABLE--创建表
DROP TABLE--删除表
ALTER TABLE--修改表

壹.贰.主干标准

建议使用Pascal样式或Camel样式命名数据库对象。

大写T-SQL语言的持有主要字,谓词和系统函数。

一.三.
对象命名
1.3.1. 
数据库
首先种方法,选择帕斯Carl样式命名,命名格式为[类型英文名称]。
示例:AdventureWorks
第三种方法,接纳帕斯Carl样式命名,命名格式为[体系英文名称] + Db。
示例:AdventureWorksDb
  BizTalkRuleEngineDb
提议使用第3种方法。

        Transact-SQL 代码中的错误可利用 T奥迪Q5Y…CATCH 构造处理,此成效相近于
Microsoft Visual C++ 和 Microsoft Visual C#
语言的不行处理效果。T大切诺基Y…CATCH 构造包罗两局地:多少个 T普拉多Y 块和二个 CATCH
块。假诺在 T奥迪Q5Y 块内的 Transact-SQL
语句中检查测试到不当条件,则控制将被传送到 CATCH
块(可在此块中拍卖此错误)。

一.二.数据操纵语言DML

是用来操纵表和视图中的数据的语句,例如查询数据(SELECT),插入数据(INSERT),更新数据(UPDATE)和删除数据(DELETE)等。

命名规范

在壹般意况下,选择Pascal样式或Camel样式命名数据库对象,使在付出基于数据库应用程序的时候经过O帕杰罗M工具生成的多少访问代码不供给调动就适合程序开发语言(比如C#)命名规范。其它,关系型数据库同Xml结合得尤为严密,规范的命名越来越首要。

在其实数据库开发过程中,如若供给方已经提供数据库设计方案,提出以提供的方案为准;在原来数据库上进展升级换代开发时,在有效的情事下可方便做出统筹调整以符合编制程序规范。

①.三.2. 
数据库文件
数据文件:[数据库名称] + _Data.mdf
日志文件:[数据库名称] + _Log.ldf
示例:AdventureWorks_Data.mdf
      AdventureWorks_Log.ldf

CATCH 块处理该越发错误后,控制将被传送到 END CATCH 语句前边的第二个Transact-SQL 语句。假若 END CATCH
语句是储存进程或触发器中的最后一条语句,则控制将回到到调用该存储进程或触发器的代码。将不进行T昂科拉Y 块中生成错误的口舌前边的 Transact-SQL 语句。

一.三.数量控制语言DCL

事关到权力管理的言语称为数据控制语言,主要用来实施有关安全管理的操作。如授予权限(GRANT),收回权限(REVOKE),拒绝授予主体权限,并幸免主体通过组或角色成员持续权限(DENY

一.3.对象命名

壹.叁.叁. 
关系型数据仓库
采取Pascal样式命名,命名格式为[花色英文名称] + DW。
示例:AdventureWorksDW

借使 T哈弗Y 块中并未不当,控制将传递到事关的 END CATCH
语句后紧跟的话语。就算 END CATCH
语句是储存进程或触发器中的最终一条语句,控制将传递到调用该存储进程或触发器的口舌。

1.肆.Transact-SQL语言功底

1.3.1. 数据库

首先种办法,接纳帕斯Carl样式命名,命名格式为[品类英文名称]。

示例:AdventureWorks

第三种办法,选择帕斯Carl样式命名,命名格式为[花色英文名称]

  • Db。

示例:AdventureWorksDb

 
BizTalkRuleEngineDb

提出利用第壹种办法。

1.三.四. 
数码架构
除SQL Server
系统定义的数码架构外,新建架构选择Pascal样式命名,命名格式为[架构名]。
示例:HumanResources
      Production

TRY 块以 BEGIN TPRADOY 语句起头,以 END TEscortY 语句结尾。在 BEGIN TCRUISERY 和 END
T猎豹CS⑥Y 语句之间能够钦定四个或三个 Transact-SQL 语句。

一.肆.1.常量与变量

常量不多说。在SQL Server
二零零六中,存在三种变量。1种是系统定义和维护的全局变量,1种是用户定义用来保存中间结果的局地变量。

一.三.二. 数据库文件

数据文件:[数据库名称] +
_Data.mdf

日记文件:[数据库名称] +
_Log.ldf

示例:AdventureWorks_Data.mdf

     
AdventureWorks_Log.ldf

对数据库对象 Table,View,Procedure,Function等采取数据架构进行分类。在SQL
Server 两千中dbo为暗中认可架构。

CATCH 块必须紧跟 T奥德赛Y 块。CATCH 块以 BEGIN CATCH 语句开始,以 END CATCH
语句结尾。在 Transact-SQL 中,种种 T福特ExplorerY 块仅与3个 CATCH 块相关联。

壹.四.壹.壹.连串全局变量

系统全局变量分为两大类,1类是与自然SQL
Server连接或与眼下处理有关的全局变量,如@@Rowcount意味着近日二个说话影响的行数。@@error代表保留近期履行操作的不当状态。一类是与壹切SQL
Server系统有关的全局变量,如@@Version意味着近期SQL Server的版本音讯。

SELECT @@VERSION AS 当前版本;--查看当前SQL Server的版本信息

结果如图所示
图片 1

一.3.3. 关系型数据仓库

采取Pascal样式命名,命名格式为[项目英文名称]

  • DW。

示例:AdventureWorksDW

1.3.5. 
数据表
选取帕斯Carl样式命名,命名格式为[表名]。
示例:Employee
      Product

使用
TRY…CATCH)

一.肆.壹.二.局地变量

一对变量能够拥有一定数据类型,有早晚的功用域,一般用来充当计数器总计或决定循环执行次数,大概用于保存数据值。局部变量前唯有3个@符,用DECLARE语句表明局地变量。

USE test
DECLARE @StudentId varchar(20)
SET @StudentId=(
SELECT Student.stu_no
FROM Student
WHERE stu_enter_score='603')
SELECT @StudentId AS 入学分数为603的学生学号
GO

结果如图所示
图片 2

一.3.4. 数据架构

除SQL Server
系统定义的数目架构外,新建架构选择帕斯Carl样式命名,命名格式为[架构名]。

示例:HumanResources

      Production

对数据库对象
Table,View,Procedure,Function等利用数据架构实行分类。在SQL Server
两千中dbo为暗许架构。

表名以英文单数命名,首要是参考SQL Server
200五演示数据库,个人驾驭不使用复数是为着更加好的施用OEvoqueM工具生成符合编制程序规范的代码(比如C#)。
示例:使用Product
  而不是Products


2.运算符

1.3.5. 数据表

使用Pascal样式命名,命名格式为[表名]。

示例:Employee

      Product

表名以英文单数命名,首假设参照SQL
Server
2005示范数据库,个人驾驭不利用复数是为了更加好的运用O帕杰罗M工具生成符合编制程序规范的代码(比如C#)。

示例:使用Product

 而不是Products

一.3.陆. 
数量视图
视图名称接纳帕斯Carl样式命名,命名格式为v + [视图名称]。
示例:vEmployee
      vSalesPerson

动用 TLacrosseY…CATCH 构造时,请依照下列规则和建议:

二.一.算数运算符

在SQL Server
二〇〇八中,算数运算包涵加(+)减(-)乘(*)除(/)取模(%)。举二个简便的事例。
示例1:在Student表中添加壹列,列名称叫stu_age,根据Student表的stu_birthday列计算stu_age列并插入数据。(演示插入整列数据的办法)
Student表数据如图所示
图片 3
施行上面的话语

ALTER TABLE Student
ADD stu_age int;--在Student表中添加stu_age列
CREATE TABLE #agetemp(stu_no varchar(8),age int);--新建一个临时表
INSERT INTO #agetemp(stu_no,age)--在临时表中插入学号和计算出来的年龄
SELECT Student.stu_no,YEAR(GETDATE())-YEAR(stu_birthday)--利用函数和运算符计算年龄
FROM Student;
UPDATE Student
SET Student.stu_age=#agetemp.age--将临时表中的age列数据整个复制到Student表的stu_age列
FROM #agetemp
WHERE Student.stu_no=#agetemp.stu_no--条件是两个表的stu_no列值相等
GO
SELECT * FROM Student

结果如图所示
图片 4

一.三.陆. 数码视图

视图名称采取Pascal样式命名,命名格式为v

  • [视图名称]。

示例:vEmployee

     
vSalesPerson

1.3.7. 
数据列
列名称命名接纳英文单词或缩写,英文单词只来自于实务定义,尽量发挥清楚含义。选择Pascal样式命名,命名格式为[列名称]。
示例:AddressID
      PostalCode

  • 每一种 TTiggoY…CATCH
    构造都必须放在一个批处理、存款和储蓄进程或触发器中。例如,无法将 T福特ExplorerY 块放置在1个批处理中而将涉及的 CATCH
    块放置在另一个批处理中。上边包车型地铁本子将生成3个不当:

     

    复制window.epx.codeSnippet.copyCode(‘CodeSnippetContainerCode_4a3d1ba2-3d02-41b2-b253-4c5ba4d3af8a’);)

    BEGIN TRY
        SELECT *
            FROM sys.messages
            WHERE message_id = 21;
    END TRY
    GO
    -- The previous GO breaks the script into two batches,
    -- generating syntax errors. The script runs if this GO
    -- is removed.
    BEGIN CATCH
        SELECT ERROR_NUMBER() AS ErrorNumber;
    END CATCH;
    GO
    
  • CATCH 块必须紧跟 TRubiconY 块。

  • T奇骏Y…CATCH 构造能够是嵌套式的。那意味能够将 T帕杰罗Y…CATCH
    构造放置在其余 T酷路泽Y 块和 CATCH 块内。当嵌套的 TPAJEROY
    块中冒出错误时,程序控制将传递到与嵌套的 T揽胜Y 块关联的 CATCH 块。

  • 若要处理给定的 CATCH 块中出现的不当,请在钦命的 CATCH 块中编辑
    THavalY…CATCH 块。

  • T奇骏Y…CATCH 块不处理导致数据库引擎关闭连接的最首要为 20
    或越来越高的失实。但是,只要连接不闭馆,T奥迪Q五Y…CATCH 就会处理主要为 20
    或更加高的荒唐。

  • 重中之重为 拾 或更低的错误被视为警告或音信性音信,T陆风X八Y…CATCH
    块不处理此类错误。

  • 正是批处理位于 T卡宴Y…CATCH
    构造的作用域内,关心音讯仍将适可而止该批处理。分布式事务战败时,Microsoft
    分布式事务处理协调器 (MS DTC) 将发送关怀消息。MS DTC
    用于管理分布式事务。

    注意

    如果在 TRY 块的作用域内执行分布式事务且发生错误,执行将传递到关联的 CATCH 块。分布式事务进入不可提交状态。CATCH 块中的执行可能由管理分布式事务的 Microsoft 分布式事务处理协调器中断。发生错误时,MS DTC 将异步通知参与分布式事务的所有服务器,并终止分布式事务中涉及的所有任务。此类通知以关注消息的形式发送(TRY…CATCH 构造不处理此类通知),批处理将被终止。当批处理完成运行时,数据库引擎将回滚所有不可提交的活动事务。如果事务进入不可提交状态时未发送错误消息,则当批处理完成时,将向客户端应用程序发送错误消息,该消息指示检测到或回滚了一个不可提交的事务。有关分布式事务的详细信息,请参阅分布式事务(数据库引擎)

贰.②.赋值运算符

即等号(=),将表明式的值赋予另3个变量。举二个简短的例子。
示例2:总括Student表中学生的平分入学成绩并打字与印刷。
Student表的多寡如图所示,stu_enter_score列存放了学员的入学战表
图片 5
推行上面包车型客车说话

DECLARE @average int--声明@average变量
SET @average=(--将计算出的平均值赋值给@average
SELECT AVG(stu_enter_score)
FROM Student)
PRINT @average--打印@average的值

结果如图所示
图片 6

1.3.7. 数据列

列名称命名采取英文单词或缩写,英文单词只来自于实际作业定义,尽量发挥清楚含义。选用帕斯Carl样式命名,命名格式为[列名称]。

示例:AddressID

      PostalCode

尽量制止使用拼音命名,假设不可防止,对于对比短的列名,选取拼音全写,假使拼音列名比较复杂,能够动用第几个字用全拼,其它字用首字母大写表示。

示例:宁波
Ningbo

  经营情势 JingYFS

尽量避免使用拼音命名,假如不可幸免,对于相比较短的列名,选用拼音全写,假设拼音列名相比较复杂,能够动用第三个字用全拼,此外字用首字母大写表示。
示例:宁波 Ningbo
  经营格局 JingYFS

错误函数

TPAJEROY…CATCH 使用下列错误函数来捕获错误音讯:

  • ERROR_NUMBEPRADO() 重临错误号。

  • ERROR_MESSAGE()
    再次回到错误音信的总体文本。此文件包蕴为别的可替换参数(如长度、对象名或时刻)提供的值。

  • ERROR_SEVE奥德赛ITY() 重临错误首要。

  • ERROR_STATE() 再次回到错误状态号。

  • ERROR_LINE() 重临导致错误的例程中的行号。

  • ERROR_PROCEDURE() 再次回到出现谬误的积存进程或触发器的名目。

能够选择那么些函数从 TLX570Y…CATCH 构造的 CATCH
块的功用域中的任何义务检索错误新闻。假设在 CATCH
块的效率域之向外调拨运输用错误函数,错误函数将赶回 NULL。在 CATCH
块中施行存款和储蓄进程时,可以在蕴藏进程中援引错误函数并将其用来检索错误消息。假设那样做,则不用在各样CATCH 块中再一次错误处理代码。在底下的代码示例中,T奥德赛Y 块中的 SELECT
语句将生成四个被零除错误。此错误将由 CATCH
块处理,它将利用存款和储蓄进度重临错误新闻。

 

复制window.epx.codeSnippet.copyCode(‘CodeSnippetContainerCode_1d70a339-2e4f-4a1c-b956-cd010ed5d475’);)

USE AdventureWorks2008R2;
GO

-- Verify that the stored procedure does not exist.
IF OBJECT_ID ('usp_GetErrorInfo', 'P') IS NOT NULL
    DROP PROCEDURE usp_GetErrorInfo;
GO

-- Create a procedure to retrieve error information.
CREATE PROCEDURE usp_GetErrorInfo
AS
    SELECT 
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() as ErrorState,
        ERROR_PROCEDURE() as ErrorProcedure,
        ERROR_LINE() as ErrorLine,
        ERROR_MESSAGE() as ErrorMessage;
GO

BEGIN TRY
    -- Generate divide-by-zero error.
    SELECT 1/0;
END TRY
BEGIN CATCH
    -- Execute the error retrieval routine.
    EXECUTE usp_GetErrorInfo;
END CATCH;
GO

贰.三.位运算符

位运算符包含与运算(&),或运算(|)和异或运算(^),能够对四个表达式实行位操作,那三个表明式能够是整型数据或贰进制数据。Transact-SQL首先把整型数据转换为二进制数据,然后按位运算。举个简单的事例。
示例3:声明三个int型变量@num一,@num二,对那三个赋值且做与或异或运算。
实践上边包车型客车口舌

DECLARE @num1 int,@num2 int
SET @num1=5 
SET @num2=6
SELECT @num1&@num2 AS 与,
@num1|@num2 AS 或,
@num1^@num2 AS 异或

结果如图所示
图片 7
扩张示例四:写一个拾进制转换为二进制的函数

CREATE FUNCTION Bin_con_dec(@dec int)--定义十进制转换为二进制函数
RETURNS varchar(20)
AS
BEGIN
DECLARE @quo int,@remainder varchar(20),@quo1 int
SET @quo=@dec
SET @remainder=''
WHILE @quo<>0
BEGIN
SET @quo1=@quo/2
SET @remainder=CAST(@quo%2 AS varchar(20))+@remainder
SET @quo=@quo1
END
RETURN @remainder
END

进行上面的函数后,运转下列语句验证函数正确性

PRINT dbo.Bin_con_dec(42)

结果为十1010,函数定义正确。

1.3.八. 仓储进度

建议使用帕斯Carl样式命名,命名格式为[仓储进程名称]。

示例:GetUser

     AddUser

备考:在SQL Server
200五示范数据库中使用Camel样式命名。

1.叁.八. 
仓储进程
提议使用帕斯Carl样式命名,命名格式为[仓库储存进度名称]。
示例:GetUser
     AddUser

编写翻译错误和语句级重新编译错误

对此与 TCR-VY…CATCH 构造在同等执行级别发生的不当,T卡宴Y…CATCH
将不处理以下两类错误:

  • 编写翻译错误,例如阻止批处理实施的语法错误。

  • 语句级重新编写翻译进程中出现的失实,例如由于名称解析延迟而造成在编写翻译后出现对象名解析错误。

当包括 T奥迪Q3Y…CATCH
构造的批处理、存款和储蓄进程或触发器生成在那之中一种错误时,TRAV四Y…CATCH
构造将不处理这几个不当。那些错误将再次回到到调用生成错误的例程的应用程序或批处理。例如,上面包车型大巴代码示例显示导致语法错误的
SELECT 语句。要是在 SQL Server Management
Studio
查询编辑器中进行此代码,则是因为批处理不可能编译,执行将不运营。错误将重返到查询编辑器,将不会由
THighlanderY…CATCH 捕获。

 

复制window.epx.codeSnippet.copyCode(‘CodeSnippetContainerCode_a3c7f9c5-7b74-48d3-aa4a-55b069b587b4’);)

USE AdventureWorks2008R2;
GO

BEGIN TRY
    -- This PRINT statement will not run because the batch
    -- does not begin execution.
    PRINT N'Starting execution';

    -- This SELECT statement contains a syntax error that
    -- stops the batch from compiling successfully.
    SELECT ** FROM HumanResources.Employee;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO

与上述示范中的语法错误不一致,语句级重新编写翻译进程中发出的荒谬不会堵住批处理进展编写翻译,然则1旦语句再一次编写翻译败北,它会及时终止批处理。例如,假如批处理含有两条语句并且第3条语句引用的表不设有,则推迟的称号解析会使该批处理成功实行编写翻译并发轫执行(无需将缺少的表绑定到查询布署),直到再一次编译该语句停止。批处理到达引用缺点和失误表的口舌时将告一段落运营,并赶回两个荒唐。在发出错误的进行级别,TRubiconY…CATCH
构造将不处理此类错误。以下示例对此行为开始展览了验证。

 

复制window.epx.codeSnippet.copyCode(‘CodeSnippetContainerCode_1fe73e6f-c4b0-442e-ac12-19a680a690a0’);)

USE AdventureWorks2008R2;
GO

BEGIN TRY
    -- This PRINT statement will run because the error
    -- occurs at the SELECT statement.
    PRINT N'Starting execution';

    -- This SELECT statement will generate an object name
    -- resolution error because the table does not exist.
    SELECT * FROM NonExistentTable;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO

由此执行 T奥迪Q7Y 块内单独批处理中的错误生成代码,能够运用 TRY…CATCH
来处理编写翻译或语句级重新编写翻译进程中产生的不当。例如,那能够透过在存款和储蓄进程中放置代码或应用
sp_executesql 执行动态 Transact-SQL 语句来落实。那使 T奥迪Q7Y…CATCH
能够在比错误发生的施行级别越来越高的施行级别捕获错误。例如,下边包车型大巴代码呈现1个变迁对象名解析错误的蕴藏进度。包罗TRubiconY…CATCH
构造的批处理在比存款和储蓄进度越来越高的级别实施,并抓获在更低级别发生的失实。

 

复制window.epx.codeSnippet.copyCode(‘CodeSnippetContainerCode_0b2af62b-4243-4c82-b2e6-813f9e9091cb’);)

USE AdventureWorks2008R2;
GO

-- Verify that the stored procedure does not already exist.
IF OBJECT_ID ('usp_MyError', 'P') IS NOT NULL
    DROP PROCEDURE usp_MyError;
GO

CREATE PROCEDURE usp_MyError
AS
    -- This SELECT statement will generate
    -- an object name resolution error.
    SELECT * FROM NonExistentTable;
GO

BEGIN TRY
    -- Run the stored procedure.
    EXECUTE usp_MyError;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO

上面是结果集:           

 

复制window.epx.codeSnippet.copyCode(‘CodeSnippetContainerCode_5e456675-453c-45fd-b1ac-cafd7ff3dbf3’);)

ErrorNumber ErrorMessage
----------- ---------------------------------------
208         Invalid object name 'NonExistentTable'.

至于详细消息,请参阅推迟名称解析和编写翻译以及履行陈设的缓存和另行行使中的“重新编写翻译执行安排”一节。

二.四.比较运算符

也称关系运算符,用于相比较多少个值的涉及,常见的有等于(=),大于(>),小于(<),大于等于(>=),小于等于(<=),不等于(<>或!=)
示例5:从Student表中询问入学战绩在平均分以上的学生消息
Student表的数目如图所示
图片 8
执行下列语句

DECLARE @ave int
SET @ave=(SELECT AVG(stu_enter_score) FROM Student)
SELECT *FROM Student
WHERE stu_enter_score>=@ave;

结果如下图所示
图片 9

注:不能够平素把代码写成下边包车型客车花样

SELECT * FROM Student
WHERE stu_enter_score>=AVG(stu_enter_score)

消息147,级别15,状态1,第2 行
聚拢不应出现在WHERE 子句中,除非该聚合位于HAVING
子句或选拔列表所蕴涵的子查询中,并且要对其进展联谊的列是外表引用。

因为AVG是聚合函数。

1.3.9. 函数

自定义函数采纳Pascal样式命名,命名格式为[函数名],系统函数使用全部大写。

示例:SELECT ISNULL(@LastName,’Unknown last
name’);

GETDATE()

备注:在SQL Server 200五演示数据库中运用Camel样式命名。

不行提交的事情

在 TMuranoY…CATCH
构造中,事务能够进去一种景况:事务保持开拓但不能够提交。事务不能够实施写作业日志的此外操作,例如修改数据或尝试回滚到保存点。不过,在此景况下,事务获取的锁将被怜惜,并且连接也维持开拓。发出
ROLLBACK
语句在此之前,或批处理终结并且数据库引擎自动回滚事务以前,不会恶化事务效果。假设工作进入不可提交状态时未发送错误消息,则当批处理完了时,将向客户端应用程序发送错误音讯,该信息提醒检验到或回滚了一个不足提交的工作。

发出错误时,事务在 TOdysseyY
块内进入不能提交状态,不然此错误将适可而止该事务。例如,数据定义语言 (DDL)
语句(如 CREATE TABLE)中的大部分破绽百出或 SET XACT_ABOGL450T 设置为 ON
时出现的大部谬误都在 TRAV4Y 块外终止事务,而在 T中华VY 块内使工作不可能提交。

CATCH 块中的代码能够由此选拔 XACT_STATE
函数来测试工作的气象。假若会话中含有不可能提交的事体,XACT_STATE 将返回
-1。如果 XACT_STATE 再次回到 -1,则 CATCH
块将不能够执行写日记的其他操作。上边的代码示例生成 DDL 语句错误,并采纳XACT_STATE
测试工作的状态,以便执行最合适的操作。

 

复制window.epx.codeSnippet.copyCode(‘CodeSnippetContainerCode_5c428cd4-77cf-4946-b90a-15b27bcd2275’);)

USE AdventureWorks2008R2;
GO

-- Verify that the table does not exist.
IF OBJECT_ID (N'my_books', N'U') IS NOT NULL
    DROP TABLE my_books;
GO

-- Create table my_books.
CREATE TABLE my_books
    (
    Isbn        int PRIMARY KEY,
    Title       NVARCHAR(100)
    );
GO

BEGIN TRY
    BEGIN TRANSACTION;
        -- This statement will generate an error because the 
        -- column author does not exist in the table.
        ALTER TABLE my_books
            DROP COLUMN author;
    -- If the DDL statement succeeds, commit the transaction.
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    SELECT
        ERROR_NUMBER() as ErrorNumber,
        ERROR_MESSAGE() as ErrorMessage;

    -- Test XACT_STATE for 1 or -1.
    -- XACT_STATE = 0 means there is no transaction and
    -- a commit or rollback operation would generate an error.

    -- Test whether the transaction is uncommittable.
    IF (XACT_STATE()) = -1
    BEGIN
        PRINT
            N'The transaction is in an uncommittable state. ' +
            'Rolling back transaction.'
        ROLLBACK TRANSACTION;
    END;

    -- Test whether the transaction is active and valid.
    IF (XACT_STATE()) = 1
    BEGIN
        PRINT
            N'The transaction is committable. ' +
            'Committing transaction.'
        COMMIT TRANSACTION;   
    END;
END CATCH;
GO

二.5.逻辑运算符

逻辑运算符的功效是对规则举办测试。ALL,AND,ANY,BETWEEN,EXISTS,IN,LIKE,NOT,ALL,SOME。上边用SOME来比喻。SOME的成效是只要在一组相比中,有个别为true那就为true。
示例6:查询Student表中是还是不是存在入学成绩超乎平均分的学员,如若存在,输出true,不存在输出false。
Student表的stu_enter_score列(入学成绩)数据如图所示
图片 10
实施上边包车型客车语句

USE test
IF (SELECT AVG(stu_enter_score) FROM Student)<=SOME(SELECT stu_enter_score FROM Student)
PRINT 'true'
ELSE
PRINT 'false'
GO

结果如图所示
图片 11

1.3.十.     用户定义数据类型

采取帕斯Carl样式命名,命名格式为[自定义数据类型名称]。

示例:Flag

      NameStyle

1.3.9. 
函数
自定义函数选取帕斯Carl样式命名,命名格式为[函数名],系统函数使用成套大写。
示例:SELECT ISNULL(@LastName,’Unknown
last name’);
GETDATE()

拍卖死锁

T猎豹CS陆Y…CATCH 可用于拍卖死锁。CATCH 块能够捕获 1205死锁就义品错误,并且作业能够回滚,直至线程解锁。有关死锁的详细新闻,请参阅死锁。

上面包车型地铁演示显示怎么利用 TCRUISERY…CATCH
处理死锁。第2某个创设用于注解死锁状态的表和用于打字与印刷错误音信的储存进度。

 

复制window.epx.codeSnippet.copyCode(‘CodeSnippetContainerCode_27a7d89d-93c6-464f-b3e4-15b197ec542e’);)

USE AdventureWorks2008R2;
GO

-- Verify that the table does not exist.
IF OBJECT_ID (N'my_sales',N'U') IS NOT NULL
    DROP TABLE my_sales;
GO

-- Create and populate the table for deadlock simulation.
CREATE TABLE my_sales 
    (
    Itemid       INT PRIMARY KEY,
    Sales        INT not null
    );
GO

INSERT my_sales (itemid, sales) VALUES (1, 1);
INSERT my_sales (itemid, sales) VALUES (2, 1);
GO

-- Verify that the stored procedure for error printing
-- does not exist.
IF OBJECT_ID (N'usp_MyErrorLog',N'P') IS NOT NULL
    DROP PROCEDURE usp_MyErrorLog;
GO

-- Create a stored procedure for printing error information.
CREATE PROCEDURE usp_MyErrorLog
AS
    PRINT 
        'Error ' + CONVERT(VARCHAR(50), ERROR_NUMBER()) +
        ', Severity ' + CONVERT(VARCHAR(5), ERROR_SEVERITY()) +
        ', State ' + CONVERT(VARCHAR(5), ERROR_STATE()) + 
        ', Line ' + CONVERT(VARCHAR(5), ERROR_LINE());
    PRINT 
        ERROR_MESSAGE();
GO

上面包车型地铁对话 一 和对话 二 的代码脚本在八个单身的 SQL Server Management
Studio
连接下同时运行。多少个会话都尝试更新表中的相同行。在第二回尝试进度中,个中3个对话将成功完结更新操作,而另3个对话将被选用为死锁牺牲品。死锁捐躯品错误将使执行跳至
CATCH 块,事务将进入无法提交状态。在 CATCH
块中,死锁就义品会回滚事务天公地道试更新此表,直到更新成功或达到了重试限制(以先产生者为准)。

 

会话 1

会话 2

 
USE AdventureWorks2008R2;
GO

-- Declare and set variable
-- to track number of retries
-- to try before exiting.
DECLARE @retry INT;
SET @retry = 5;

-- Keep trying to update 
-- table if this task is 
-- selected as the deadlock 
-- victim.
WHILE (@retry > 0)
BEGIN
    BEGIN TRY
        BEGIN TRANSACTION;

        UPDATE my_sales
        SET sales = sales + 1
        WHERE itemid = 1;

        WAITFOR DELAY '00:00:13';

        UPDATE my_sales
        SET sales = sales + 1
        WHERE itemid = 2;

        SET @retry = 0;

        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH 
        -- Check error number.
        -- If deadlock victim error,
        -- then reduce retry count
        -- for next update retry. 
        -- If some other error
        -- occurred, then exit
        -- retry WHILE loop.
        IF (ERROR_NUMBER() = 1205)
            SET @retry = @retry - 1;
        ELSE
            SET @retry = -1;

        -- Print error information.
        EXECUTE usp_MyErrorLog;

        IF XACT_STATE() <> 0
            ROLLBACK TRANSACTION;
    END CATCH;
END; -- End WHILE loop.
GO
 
USE AdventureWorks2008R2;
GO

-- Declare and set variable
-- to track number of retries
-- to try before exiting.
DECLARE @retry INT;
SET @retry = 5;

--Keep trying to update 
-- table if this task is 
-- selected as the deadlock 
-- victim.
WHILE (@retry > 0)
BEGIN
    BEGIN TRY
       BEGIN TRANSACTION;

        UPDATE my_sales
        SET sales = sales + 1
        WHERE itemid = 2;

        WAITFOR DELAY '00:00:07';

        UPDATE my_sales
        SET sales = sales + 1
        WHERE itemid = 1;

        SET @retry = 0;

        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH 
        -- Check error number.
        -- If deadlock victim error,
        -- then reduce retry count
        -- for next update retry. 
        -- If some other error
        -- occurred, then exit
        -- retry WHILE loop.
        IF (ERROR_NUMBER() = 1205)
            SET @retry = @retry - 1;
        ELSE
            SET @retry = -1;

        -- Print error information.
        EXECUTE usp_MyErrorLog;

        IF XACT_STATE() <> 0
            ROLLBACK TRANSACTION;
    END CATCH;
END; -- End WHILE loop.
GO

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图