>

《Microsoft Sql server 二〇一〇 Internals》读书笔记

- 编辑:乐百家599手机首页 -

《Microsoft Sql server 二〇一〇 Internals》读书笔记

2.1.游标定义的参数LOCAL和GLOBAL

游标定义参数LOCAL表示该游标只好成效于本次批管理或函数或存款和储蓄进程。游标定义参数GLOBAL表示该游标能够成效于大局。
实行下列语句

DECLARE stu_cursor CURSOR LOCAL
FOR SELECT * FROM student
GO
OPEN stu_cursor
GO

试行结果如下
乐百家lo599 1
语句中,证明了一个student表的游标stu_cursor,在开垦游标时提示游标海市蜃楼。因为该游标参数是LOCAL,只好功效于当下批管理语句中,而张开游标语句和注解语句不在二个批管理中。要是去掉第贰个GO,使三个语句在同贰个批管理中,就能够胜利进行不会报错。
实施下列语句

DECLARE stu_cursor1 CURSOR GLOBAL
FOR SELECT * FROM student
GO
OPEN stu_cursor1
GO

执行结果:命令已成功完成
和LOCAL参数相比较,GOLBAL参数设置游标作用于大局,由此OPEN和DECLARE语句不在同贰个批处理中还是能够成功实行。

3.5.WAITFOTucson推迟语句

WAITFO奥迪Q3延迟语句能够让在它今后的口舌在贰个钦点的随时只怕时间距离后试行,可以悬挂起批处理,存款和储蓄进度或职业的施行。
示例12:在某些时间点查询Student表学号为20180101的学员新闻

BEGIN
WAITFOR TIME '15:03'--在15点03分查询
SELECT * FROM Student
WHERE stu_no='20180101'
END

示例13:在3分钟后查询Student表学号为20180102的学生音讯

BEGIN
WAITFOR DELAY '00:03'--在3分钟后查询
SELECT * FROM Student
WHERE stu_no='20180102'
END

乐百家lo599 2

管住存款和储蓄进度

①查看存款和储蓄进程消息

乐百家lo599 3

②修改存款和储蓄进度

ALTER PROCEDURE|PROC [schema_name.] procedure_name
    -- Add the parameters for the stored procedure here
    [ { @parameter [ type_schema_name. ] data_type }  
        [ VARYING ] [ = default ] [ OUT | OUTPUT | [READONLY]  
    ] [ ,...n ]   
    [WITH <procedure_option> [ ,...n ]]
    [FOR REPLICATION]
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }

<procedure_option> ::=   
    [ ENCRYPTION ]  
    [ RECOMPILE ]  
    [ EXECUTE AS Clause ]

③删减存款和储蓄进度

DROP { PROC | PROCEDURE } [ IF EXISTS ] { [ schema_name. ] procedure } [ ,...n ]  
DBCC FREEPROCCACHE;
GO
SELECT * FROM AdventureWorks.Sales.SalesOrderHeader AS h
INNER JOIN AdventureWorks.Sales.SalesOrderDetail AS d
  ON h.SalesOrderID = d.SalesOrderID
WHERE h.SalesOrderID = 45639;
GO
SELECT * FROM AdventureWorks.Sales.SalesOrderHeader AS h
INNER JOIN AdventureWorks.Sales.SalesOrderDetail AS d
  ON h.SalesOrderID = d.SalesOrderID
WHERE h.SalesOrderID = 45640; 
3.4.2.4.目录视图查看存款和储蓄进度

实践下列语句

SELECT * FROM sys.procedures

结果如图所示
乐百家lo599 4

4.1.数据类型转变函数

默许处境下SQL Server会对一部分数据类型实行自动调换,这种转移称为隐式转换。遭受不只怕活动转变,则须求用CAST()函数和CONVERT()函数调换,这种转移称为显式转换。CAST()函数和CONVERT()函数的意义是一致的,CAST函数更便于采用,CONVERT函数的独到之处是能够内定日期和数值格式。
示例16:将Student表中的学号转变为日期格式
上边两句语句的职能是一样的,实行下列语句

SELECT stu_name,CAST(stu_no AS DATE) AS 学号转换成日期,stu_enter_score,stu_birthday FROM Student
SELECT stu_name,CONVERT(DATE,stu_no) AS 学号转换成日期,stu_enter_score,stu_birthday FROM Student

结果如图所示
乐百家lo599 5
示例17:用CONVERT()函数将stu_birthday转化成钦点格式的日期
实践下列语句

SELECT stu_name,CONVERT(VARCHAR(20),stu_birthday,101) FROM Student
--CONVERT函数将DATE类型的stu_birthday字段转化为字符串,并限定了样式,代码101

结果如图所示
乐百家lo599 6

注:在上述代码中,CONVERT(DATE,stu_birthday,101)这么写是没用的。101格式码只对日期格式转化为字符串有效,别的格式转化为日期格式是对事情未有什么帮助的。

其余常用函数太轻易了那边不写了,略。

进行存款和储蓄进程

调用存款和储蓄进程使用Execute|Exec关键字,不能够大概。

Execute|Exec
{
  [@整形变量=]
  存储过程名[,n]|@存储过程变量名
  [[@过程参数=]参数值|@可变参数名 [OUTPUT]|[DEFAULT]]
  [,..,n]
  [WITH RECOMPILE]
}
  • @整形变量:可选,代表存款和储蓄进程的回到状态。
  • n:可选,用于对同名的经过分组。
  • @进程参数:为存款和储蓄进程的参数赋值。

SQL Server提供了二种传递参数的点子:
(1)按岗位传递参数,即传送的参数和概念时的参数顺序一致,如:
execute au_info 'Dull','Ann'
(2)通过参数名传递,采取“参数=值”的款型,此时各样参数能够放肆排序,如:
execute au_info @firstName='Dull',@lastName='Ann' 或
execute au_info @lastName='Ann',@firstName='Dull'

  • OUTPUT:钦赐该参数为出口参数。
  • DEFAULT:指明该参数使用私下认可值。假设该参数定义时没有一点点名私下认可值,则无法动用DEFAULT选项。
  • WITH RECOMPILE:强制在施行存款和储蓄进度时再一次对其进展编译。

【示例】
(1)带OUTPUT参数的仓储进程——最终的再次来到值存款和储蓄在调用程序评释的OUTPUT变量中

create procedure Query_Relationer
   @QueryCID int,                   -- 输入的形参
   @QueryRName varchar(20) OUTPUT   -- 输出的形参
as
begin
  if exists(select rid from Customer where cid = @QueryCID)
    select @QueryRName = RName from Relationer
    where rid = (select rid from Customer where cid = @QueryCID and cStatus = 1)
  else
    set @QueryRName = '不存在'
end
go

调用进程如下:

declare @Relationer_name varchar(20),@Cust_ID int
execute Query_Relationer @Cust_ID=20103530,@Relationer_name OUTPUT
print '客户ID为' convert(char(8),@Cust_ID) '的联系人是:' @Relationer_name

(2)带Return参数的囤积进度

create proc up_user
as
delcare @age int
begin
  select @age=uage from user
  return @age
end

(3)同一时候带Return和output参数的存款和储蓄进度

create proc up_user
@id int,
@name varchar(20) output
as
 declare @age int
 begin
  select @age=stuage,@name=stuname from stuinfo where uid=@id
  return @age
 end

调用进度如下:

declare @age int
declare @name varchar(20)
exec @age=up_user 2,@name output
-- 输出age和name
select @age,@name

布置指南在标准版。公司版、评估版、和开荒版中可用。借使从一个支撑的SQL Server版本中detach二个含有布置指南的数据库,然后再附加玛个不援助的版本,如workgroup版本或Express版本中。SQL Server不应用其它安插指南。满含安排指南音讯的元数据依然可用。

2.4.游标的粗略利用

示例2:将student表中stu_enter_score大于600分的学生都减去100分
Student表中的数据如图所示
乐百家lo599 7
试行下列语句

--游标的简单应用
DECLARE stu_cursor CURSOR FORWARD_ONLY LOCAL
FOR SELECT stu_no,stu_enter_score FROM student
OPEN stu_cursor
DECLARE @score INT
DECLARE @stu_no VARCHAR(8)
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--把游标值赋值给变量@score
WHILE @@FETCH_STATUS=0 
BEGIN
IF @score>=600
BEGIN
UPDATE student
SET stu_enter_score=@score-100 WHERE stu_no=@stu_no 
END
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--把游标值赋值给变量@score
END
CLOSE stu_cursor
DEALLOCATE stu_cursor
GO

结果如图所示
乐百家lo599 8

3.1.BEGIN END语句块

BEGIN END能够定义SQL Server语句块,使那些讲话作为一组语句试行,允许语句嵌套。比如请见示例4

存款和储蓄进度优点

运作T-SQL语句进行编制程序有三种方法,一种是把T-SQL语句全体写在应用程序中,并蕴藏在地点;另一种是把一部分T-SQL语句编写的顺序作为存款和储蓄进程存款和储蓄在SQL Server中,独有本地的应用程序调用存款和储蓄过程。大非常多程序猿侧向利用后面一个,原因在于存款和储蓄进度具备以下优点:

  • 叁遍编写翻译,多次施行。第三次实行有些进度时,将编写翻译该进度以分明检索数据的最优访谈布署。 若是已经转移的安排仍保存在数据库引擎布署缓存中,则该进程随之奉行的操作只怕再次使用该安顿。
  • 可在应用程序中多次调用;修改存款和储蓄进程不会影响使用程序源代码。
  • 积累进度存款和储蓄在服务中,能够缩小互连网流量。比如三个亟需数百行T-SQL代码的操作能够透过一条施行存款和储蓄进程代码的语句来调用,而不须要在互联网中发送数百行代码。
  • 储存进程可被用作一种安全体制来丰盛利用。能够只授予用户实施存款和储蓄进程的权杖,而不予以用户直接待上访谈存款和储蓄进程中涉及的表的权柄。那样,用户只可以通过存款和储蓄进度来访谈表,并张开轻巧的操作,进而确定保障了表中数量的安全。动用授权操作设置各样用户的权柄
DECLARE @sample_statement nvarchar(max);
DECLARE @paramlist nvarchar(max);
EXEC sp_get_query_template
  N'SELECT * FROM AdventureWorks.Sales.SalesOrderHeader AS h
   INNER JOIN AdventureWorks.Sales.SalesOrderDetail AS d
     ON h.SalesOrderID = d.SalesOrderID
   WHERE h.SalesOrderID = 45639;',
  @sample_statement OUTPUT,
  @paramlist OUTPUT
SELECT @paramlist as parameters, @sample_statement as statement
EXEC sp_create_plan_guide @name = N'Template_Plan',
  @stmt = @sample_statement,
  @type = N'TEMPLATE',
  @module_or_batch = NULL,
  @params = @paramlist,
  @hints = N'OPTION(PARAMETERIZATION FORCED)';

2.3.游标参数FO路虎极光WAENCORED_ONLY和SCROLL

FORWARD_ONLY参数设置游标只好从结果集的发端向甘休方向读取,使用FETCH语句时只可以用NEXT,而SCROLL参数设置游标能够从结果集的轻便方向,任意地方移动。如下列语句

--语句1,默认FORWARD_ONLY
DECLARE stu_cursor CURSOR LOCAL
FOR SELECT * FROM student
OPEN stu_cursor
FETCH NEXT FROM stu_cursor
GO
--语句2,FORWARD_ONLY参数,FETCH时只能从开始往结束方向
DECLARE stu_cursor CURSOR FORWARD_ONLY LOCAL
FOR SELECT * FROM student
OPEN stu_cursor 
FETCH NEXT FROM stu_cursor
GO
--语句3,SCROLL参数,FETCH时可以从任意位置往任意方向
DECLARE stu_cursor CURSOR SCROLL LOCAL
FOR SELECT * FROM student
OPEN stu_cursor
FETCH LAST FROM stu_cursor
GO

2.8.运算符的先行级

优先级 运算符
1 ~(位反)
2 *(乘),/(除),%(取模)
3 (正),-(负), (加), (连接),-(减),&(位与)
4 =,>,<,>=,<=,<>,!=,!>,!<(比较运算符)
5 ^(位异或),位或(符号打不出来,前面有,自己翻)
6 NOT
7 AND
8 ALL,ANY,BETWEEN,IN,LIKE,ALL,SOME
9 =(赋值)

当表明式中的运算符有一样的早期级时,根据它们在表明式中的地点,一元运算符按从右往左运算,二元运算符(对五个表明式效率的运算符)按从左往右运算。
示例9:验证运算符优先级
推行下列语句

DECLARE @result INT,@num INT
SET @num=45
SET @result=@num (~@num)*4-@num/(~@num)
SELECT @result AS result
GO

结果如图所示
乐百家lo599 9
算算代码中的表明式
@result=@num (~@num)4-@num/(~@num)
=@num (-46)
4-@num/(-46)
=45 (-46)4-45/(-46)
=45 (-46)
4
=-139

积攒过程传递会集参数以及重回、接收结果集

(1)传递群集参数

A、传递几个形参

B、使用表值参数
  使用表值参数类型将多少个行插入表中。 一下演示将创立参数类型,注明表变量来援用它,填充参数列表,然后将值传递给存款和储蓄进程。 存款和储蓄进程使用那一个值将多个行插入表中。

/* Create a table type. */  
CREATE TYPE LocationTableType AS TABLE   
( LocationName VARCHAR(50)  
, CostRate INT );  
GO  

/* Create a procedure to receive data for the table-valued parameter. */  
CREATE PROCEDURE usp_InsertProductionLocation  
    @TVP LocationTableType READONLY  
    AS   
    SET NOCOUNT ON  
    INSERT INTO [AdventureWorks2012].[Production].[Location]  
           ([Name]  
           ,[CostRate]  
           ,[Availability]  
           ,[ModifiedDate])  
        SELECT *, 0, GETDATE()  
        FROM  @TVP;  
GO  

/* Declare a variable that references the type. */  
DECLARE @LocationTVP   
AS LocationTableType;  

/* Add data to the table variable. */  
INSERT INTO @LocationTVP (LocationName, CostRate)  
    SELECT [Name], 0.00  
    FROM   
    [AdventureWorks2012].[Person].[StateProvince];  

/* Pass the table variable data to a stored procedure. */  
EXEC usp_InsertProductionLocation @LocationTVP;  
GO  

(2)重临结果集

A、使用 OUTPUT 游标参数
  以下示例使用 OUTPUT 游标参数将经过的一对游标传递回实行调用的批管理、进度或触发器。
  首先,创建在 Currency表上宣称并打开多少个游标的历程:

IF OBJECT_ID ( 'dbo.uspCurrencyCursor', 'P' ) IS NOT NULL  
    DROP PROCEDURE dbo.uspCurrencyCursor;  
GO  
CREATE PROCEDURE dbo.uspCurrencyCursor   
    @CurrencyCursor CURSOR VARYING OUTPUT  
AS  
    SET NOCOUNT ON;  
    SET @CurrencyCursor = CURSOR  
    FORWARD_ONLY STATIC FOR  
      SELECT CurrencyCode, Name  
      FROM Sales.Currency;  
    OPEN @CurrencyCursor;  
GO  

接下去,运维以下批处理:声雅培个有的游标变量,试行上述进程以将游标赋值给部分变量,然后从该游标提取行。

DECLARE @MyCursor CURSOR;  
EXEC dbo.uspCurrencyCursor @CurrencyCursor = @MyCursor OUTPUT;  
WHILE (@@FETCH_STATUS = 0)  
BEGIN;  
     FETCH NEXT FROM @MyCursor;  
END;  
CLOSE @MyCursor;  
DEALLOCATE @MyCursor;  
GO  

B、使用OUTPUT重回八个出口参数
  这种格局劣点在于一旦结果凑集几百个要素,那么在存款和储蓄进度将在注解几百个变量,十二分难为。

CREATE PROCEDURE Student.singS
      @id int,
      @name varchar(20) OUTPUT,
      @age int OUTPUT
AS
   select name,age from Student where id=@id
GO

调用段:

DECLARE @name varchar(20),@age int
EXECUTE Student.singS 28, @name OUTPUT,@age OUTPUT
print '学生的姓名为:' @name ',年龄为:' @age

C、SELECT再次回到结果集
  在储存进程中写一段再次回到一个结出集的SELECT语句,假如在调用段中仅仅EXEC procedure_name [parameter1...parametern],那么该SELECT语句的结果只是只会输出到荧屏上,而不能够用那一个结果集做继续管理。固然要保存此结果集,唯有一种办法,即经过动用 INSERT/EXEC 将其积攒到永世表、一时表或表变量中,进而将结果流式管理到磁盘。

①把结果集存款和储蓄在不常表
创建存款和储蓄进程:

CREATE PROCEDURE Proc1
 @a varchar(50)
AS
 SELECT id,name FROM Table1 WHERE name=@a

调用段:

-- 创建一个临时表,和存储过程的结果集结构一致
CREATE TABLE #t1
(
  id int,
  name varchar(50)
)

-- 把结果集插入临时表中
INSERT INTO #t1 EXEC Proc1 'Ada'
-- do something with results
--用完之后要把临时表清空
DROP TABLE #t1

②把结果集存款和储蓄在表变量
  但这种措施在询问的数据量非常大的事态下相比影响属性,查询速度异常慢,在数据量异常的小的境况下这种反差并不显明。

create proc proc1 as
   select col1 from dbo.table1;

create proc proc2 as
   declare @t table(col1 int);
   insert @t (col1) exec proc1;
   -- do something with results

注意:一个变量并差别于三个参数,纵然他们用同一的不二等秘书技被写。因为经过仅在被施行时编写翻译。而SQL Server总是选用多个概念的参数值,当前贰个已编写翻译布署使用分裂的参数时难点应际而生了。然则,对于一个部分变量,当使用变量的说话被编译时,那一个值是未知的,直到Recompile提醒被运用。

3.4.2.翻看存款和储蓄进度

可以经过行使系统存储进度大概目录视图查看存款和储蓄进程的定义

3.6.RETUHighlanderN无条件退出语句

该语句表示无条件结束查询,批管理或存款和储蓄进程的实施。存储过程和批管理RETUTucsonN语句后边的话语都不再施行。当在蕴藏进程中选拔该语句时,能够内定再次来到给调用应用程序、批管理或进度的整数值。借使RETUOdysseyN未钦定再次回到值,则存款和储蓄进度的重回值是0

受制与限定

①在单个批管理中,CREATE PROCEDURE 语句不能够与其余 Transact-SQL 语句组合使用。
②以下语句不可能用于存款和储蓄进度主体中的任哪个地方方。

乐百家lo599 10

③进度可以援引尚荒诞不经的表。 在创马上,只进行语法检查。 直到第一回试行该进程时才对其打开编写翻译。 独有在编写翻译进度中才分析进程中引用的享有目的。 因而,要是语法准确的长河援引了不设有的表,则还是能成功创办;但万一被引用的表不设有,则经过将要实行时将倒闭。
④不能够将某一函数名称钦赐为参数默许值也许在施行进度时传递给参数的值。 但是,您能够将函数作为变量传递,如以下示例中所示:

-- Passing the function value as a variable.  
DECLARE @CheckDate datetime = GETDATE();  
EXEC dbo.uspGetWhereUsedProductID 819, @CheckDate;   

⑤倘若该进程对 SQL Server 的长距离实例举行更换,将不大概回滚这个改换。 远程进度不插足业务。

Keep Plan   Keep Plan提示放宽三个询问的重编写翻译阈值,极其询问访谈不常表时。我们在前边的章节中提到过,当访谈二个不常表的查询而表的更换达到6个时,查询被重编写翻译。假使采用KeepPlan,则有的时候表的重编写翻译阈值等同于固定表。

3.4.2.1.图形化分界面

如下图
乐百家lo599 11

2.5.逻辑运算符

逻辑运算符的意义是对标准进行测量检验。ALL,AND,ANY,BETWEEN,EXISTS,IN,LIKE,NOT,ALL,SOME。上面用SOME来比喻。SOME的效率是假若在一组比较中,有些为true那就为true。
示例6:查询Student表中是否留存入学成绩超越平均分的学员,假使存在,输出true,子虚乌有输出false。
Student表的stu_enter_score列(入学战绩)数据如图所示
乐百家lo599 12
施行下边包车型客车讲话

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

结果如图所示
乐百家lo599 13

仓库储存进度分类

(1)系统存款和储蓄进度
  SQL Server提供的囤积进度,用于实施与系统有关的职分,主要囤积在master数据库并以sp_为前缀,例如sp_addtype、sp_rename等。

乐百家lo599 14

(2)扩大存款和储蓄进度
  扩大存款和储蓄进度是以在SQL Server情状之外实践的动态链接库(Dymatic-Link)Libraries,DDL)来达成的,实行系统存储进度不能独当一面包车型大巴天职,如发邮件、文件管理等,平时以前缀xp_开头。推行扩大存款和储蓄进度的艺术与积攒进度的相似。

(3)一时存款和储蓄进程
  不常存款和储蓄过程首先是本土存款和储蓄进程。SQL Server帮助三种临时存款和储蓄进度:局地临时进度和大局不经常进程。
  若是存款和储蓄进度的日前有叁个标识“#”,那么它正是有的有的时候进程,只好在多个用户会话中接纳,在现阶段对话停止时就能够被除去。
  假使存款和储蓄进度的前边有八个标记“##”,那么把该存款和储蓄进度称为全局不时存储进度,能够在具有用户会话中选拔,在采纳该进度的末尾三个会话甘休时除了。

(4)用户定义的储存过程
  用户自定义的存款和储蓄进度由用户成立的一组T-SQL语句群集组成,能够收到和重临用户提供的参数,完结某个特定作用。
  存款和储蓄进度创立好且语法正确后,系统将储存进度的名目存款和储蓄在时下数据库的系统表sysobject中;将积存进程的文件存款和储蓄在日前数据库的系统表syscomments中。

布署指南,在SQL Server二零零五中新扩张的法力,建议一种缓慢解决方案,能够给您三个机制仅扩张Hint到查询而不需改动查询自身。主要地,三个布署指引告诉优化器,假使它试图优化三个异样格式的查询,它应有扩张叁个Hint到查询。SQL Server帮忙三种档期的顺序的计划指南:SQL,Object和templete。

2.2.游标分为游标变量和游标类型

如下列语句

--语句1
DECLARE stu_cursor CURSOR
FOR SELECT * FROM student--声明student表的游标名称为stu_cursor并赋值
GO

--语句2
DECLARE @stu_cursor CURSOR--声明游标类型的变量@stu_cursor
SET @stu_cursor=CURSOR FOR--给该变量赋值
SELECT * FROM student

在语句1中央市直机关接注脚了二个游标并赋值,而语句第22中学宣示了游标类型的变量@stu_cursor,然后给该变量赋值。这多头是见仁见智的。

1.4.1.常量与变量

常量相当的少说。在SQL Server 2010中,存在三种变量。一种是系统定义和维护的全局变量,一种是用户定义用来保存中间结果的部分变量。

开创存款和储蓄进度

积攒进度语法如下:

CREATE PROCEDURE|PROC [schema_name.] procedure_name
    -- Add the parameters for the stored procedure here
    [ { @parameter [ type_schema_name. ] data_type }  
        [ VARYING ] [ = default ] [ OUT | OUTPUT | [READONLY]  
    ] [ ,...n ]   
    [WITH <procedure_option> [ ,...n ]]
    [FOR REPLICATION]
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }

<procedure_option> ::=   
    [ ENCRYPTION ]  
    [ RECOMPILE ]  
    [ EXECUTE AS Clause ]  
  • schema_name:该进度所属的架构的名号。若是在创造进度时未内定架构名称,则自动分配正在创立进程的用户的默许架构。
  • 能够经过行使多个#符号在procedure_name从前创立当地一时进度(#procedure_name)或两个#标记创制全局临时进度(## procedure_name) 。局地偶然程序仅对创设了它的总是可知,何况在关门该连接后将被删去。 全局有时程序可用以全数连接,并且在使用该进度的末尾八个对话甘休时将被剔除。
  • @parameter:钦命进程中的参数,是一对的,能够声澳优(Ausnutria Hyproca)个或多少个。
  • 假使内定了FO奥迪Q5 REPLICATION,则不可能表明参数。
  • parameter能够是输入参数or输出参数,若为输入参数IN能够不写,系统私下认可;若为输出参数则要增进OUTPUT。
  • 表值参数只好是 INPUT 参数,而且这几个参数必须含有 READONLY 关键字。
  • 光标数据类型只好是出口参数和必须附带由 VAWranglerYING 关键字。
  • OUT | OUTPUT提示参数是出口参数,使用 OUTPUT 参数将值再次来到给进程的调用方。
  • [ =default ]:参数的私下认可值。 假如默料定义值,该函数能够执行而没有要求点名该参数的值。
  • WITH ENC纳瓦拉YPTION:SQL Server加密syscomments表中涵盖CREATE PROCEDURE语句文本的条条框框,即对用户隐蔽存款和储蓄进程的文书,不可能从syscomments表中拿走该存款和储蓄进程的音讯。
  • WITH RECOMPILE:提醒数据库引擎不缓存该进度的布署,该进度就要历次运转时再次编写翻译。如若钦命了FORREPLICATION,则不能够接纳此选项。
  • EXECUTE AS子句:钦定在其间施行进度的广元上下文。

有关参数

  • 存款和储蓄进程参数也能够包括默许值,如:
create procedure pun_info @pubname varchar(20)='ALGOdata'
  • 仓库储存进程参数能够包罗通配符,如:
create procedure pun_info 
   @name varchar(20)='D%'
as
  select name from authors where name like @name

有关出口
①OUTPUT参数
  假诺在进程定义中为参数钦点 OUTPUT 关键字,则存款和储蓄进度在脱离时可将该参数的脚下值重临至调用程序。若要用变量保存参数值以便在调用程序中接纳,则调用程序必须在进行存款和储蓄进度时选择OUTPUT 关键字。
  也足以在实施进度时为 OUTPUT 参数钦定输入值。 那将允许进度从调用程序接收值,使用该值更动或实践操作,然后将新值重返给调用程序。
②施用重临代码重返数据
  进度能够回去七个整数值(称为“重回代码”),以提醒进度的实市场价格况。 使用 RETULX570N 语句内定进程的回来代码。 与 OUTPUT 参数同样,实践进度时务必将赶回代码保存到变量中,才能在调用程序中选拔再次来到代码值。
  RETU福特ExplorerN是从查询或进程中无条件退出,不实践位于 RETUOdysseyN 事后的讲话。RETU宝马X5N再次回到的无法是空值,假设经过试图再次回到空值,将生成警告新闻并赶回 0 值。用输出参数OUTPUT可以输出任性等级次序的结果(不包蕴表类型),而RETU普拉多N只可以回去整型并且总能重返一个整型值。一般的RETU中华VN用来回到重临代码(如0代表推行成功,1意味着未钦命所需参数值)。
  RETULacrosseN和OUTPUT还是可以出现在一样存款和储蓄进程中,详见示例(3)。

贰个object类型的陈设指南,标示你对在产出在SQL Server对象的上下文的T-SQL感兴趣,可能是创办陈设指南的数据库中的存款和储蓄进度、用户自定义函数、或触发器。比如,大家只要叁个积累进度Sales.GetOrderByCountry,使用country作为三个参数。在检查错误和别的有效后,它回到三个结出集。更上一层楼,假定大家的测量检验已经调节给定的参数值"US"以最好安顿。这里运用Optimize for提醒,以下示例创立三个陈设指南,它与在依靠应用程序的积攒进度的上下文中所施行的查询相配,并将 OPTIMIZE FOR 提醒应用于该查询。

3.4.2.2.系统存款和储蓄进程sp_helptext查看存款和储蓄进度定义

实施下列语句

EXEC sp_helptext 'alter_data'

结果如图所示
乐百家lo599 15

  • 1.选拔Transact-SQL语言编制程序
    • 1.1.数额定义语言DDL
    • 1.2.数据垄断(monopoly)语言DML
    • 1.3.数量调节语言DCL
    • 1.4.Transact-SQL语言功底
  • 2.运算符
    • 2.1.算数运算符
    • 2.2.赋值运算符
    • 2.3.位运算符
    • 2.4.相比较运算符
    • 2.5.逻辑运算符
    • 2.6.连接运算符
    • 2.7.一元运算符
    • 2.8.运算符的事先级
  • 3.决定语句
    • 3.1.BEGIN END语句块
    • 3.2.IF ELSE语句块
    • 3.3.CASE分支语句
    • 3.4.WHILE语句
    • 3.5.WAITFOSportage延迟语句
    • 3.6.RETU奥迪Q5N无条件退出语句
    • 3.7.GOTO跳转语句
    • 3.8.T奥德赛Y CATCH错误管理语句
  • 4.常用函数
    • 4.1.数据类型转变函数
USE Northwind2;
DECLARE @custID nchar(10);
SET @custID = 'LAZYK';
SELECT * FROM Orders WHERE CustomerID = @custID; 

3.3.3.加密存款和储蓄进度的概念

假诺要创建存款和储蓄进度并保管别的用户不可能查看该存款和储蓄进程的概念,则能够动用WITH ENCWranglerYPTION,那样,进程定义将以不足读的款型积累。

3.8.TWranglerY CATCH错误管理语句

万一TENVISIONY块内部产生错误,会将调控传递给CATCH块内的语句组。T大切诺基Y CATCH构造捕捉全体严重等第大于10但不会停下数据库连接的失实。
示例15:TRY CATCH的示例
实践下列语句

BEGIN TRY
SELECT * FROM Student
SELECT 120/0 FROM Student
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS '错误信息'
END CATCH

实践结果如图所示
乐百家lo599 16
语句中3个select语句全部都实践了。即使把报错的select语句放到不奇怪的select语句前边,不荒谬的select语句仍能不能够奉行呢?推行下列语句

BEGIN TRY
SELECT 120/0 FROM Student
SELECT * FROM Student
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS '错误信息'
END CATCH

结果如图所示
乐百家lo599 17
寻常select语句不能够实践。TWranglerY CATCH语句的逻辑是,一旦T奥迪Q3Y语句块中冒出难题讲话,立时跳转到CATCH语句块,TTucsonY语句块接下去的语句不再实施。

Optimize For   Optimize For提醒告知优化器就像多个特意的值被用作八个变量或参数。推行使用一个安分守己的值,记住,Optimize For提醒并不强制SQL Server被重编写翻译,它唯有提示SQL Server假定一个变量或参数有二个特地的值,此时,SQL Server已经决定查询需求优化。

3.3.1.创办存款和储蓄进度准则

在安排和开创存款和储蓄进程时,应该满意一定的自律和法则。

  • CREATE PROCEDURE定义本身能够归纳私下数量和品种的SQL语句,但下表中的语句除此而外。无法在存款和储蓄进度的另外职责运用那些话语。
  • 能够援引在联合存款和储蓄进程中创建的对象,只要援引时已开立了该对象
  • 能够在存款和储蓄进程内引用一时表
  • 一经在仓库储存进程中成立了地点有时表,该不经常表仅为该存款和储蓄进度而存在,退出该存储进度后,该有时表会消失
  • 假设推行的寄放进度调用了另一个存储进度,被调用的储存进度能够访问第多个存款和储蓄进程的富有指标,包罗有时表
  • 假若推行对长途SQL Server 二〇〇九实例实行改造的长途存款和储蓄进程,那一个改换将不可能被回滚。远程存款和储蓄进度不参加事务管理
  • 储存进程中的参数的最大数目为2100
  • 储存进度中的局地变量的最大数量仅受可用内部存储器的限定
  • 据悉可用内部存款和储蓄器的例外,存款和储蓄过程最大可达128MB
语句 语句 语句
CREATE AGGREGATE CREATE RULE CREATE DEFAULT
CREATE SCHEMA CREATE(ALTER) FUNCTION CREATE(ALTER) TRIGGER
CREATE(ALTER) PROCEDURE CREATE(ALTER) VIEW SET PARSEONLY
SET SHOWPLAN_ALL SET SHOWPLAN_TEXT SET SHOWPLAN_XML
USE database_name

2.7.一元运算符

一元运算符只对二个表明式实行操作,该表明式可以是数字数据类型中的任何一种数据类型。SQL Server 二零一零提供的一元运算符包括正( ),负(-),位反(~)。
乐百家lo599 ,示例8:声爱他美个int数据类型变量@num并赋值,对该变量做正负位反操作。
实践下列语句

DECLARE @num INT
SET @num=45
SELECT  @num AS 正,-@num AS 负,~@num AS 位反
GO

结果如图所示
乐百家lo599 18

注:位反操作符用于取三个数的补数,只可以用于整数。

 

3.储存进程

存款和储蓄进度是一组用于实现一定效能的语句集,经过编写翻译后存款和储蓄在数据库中。在SQL Server 二〇〇九中,既可以够用T-SQL编写存款和储蓄进程,也得以用CLLX570编写存款和储蓄进程。

3.4.WHILE语句

用来安装双重推行T-SQL语句或语句块的条件。
示例11:用“*”在显示屏上输出贰个小幅度为9的菱形。
实施下列语句

DECLARE @width int,@j int
SET @width=9--@width为菱形的最大宽度
SET @j=1--@j表示每行打印的“*”符号的个数
WHILE @j<=@width
BEGIN
PRINT SPACE((@width-@j)/2) REPLICATE('*',@j)--SPACE函数打印n个空字符,REPLICATE打印n个特定字符串
SET @j=@j 2
END
SET @j=@width-2
WHILE @j>0
BEGIN
PRINT SPACE((@width-@j)/2) REPLICATE('*',@j)
SET @j=@j-2
END

结果如图所示
乐百家lo599 19

 

3.1.用户定义的积攒进度

该种存款和储蓄进度是指封装了可选替代码的模块或然经过,有2连串型:T-SQL存款和储蓄进程和CL揽胜存款和储蓄进程。
T-SQL存款和储蓄进度是指保存的T-SQL语句集合
CL奥迪Q5存款和储蓄进程是指对Microsoft .NET Framework公共语言运维时(CL库罗德)方法的引用

2.1.算数运算符

在SQL Server 二零一零中,算数运算包蕴加( )减(-)乘(*乐百家数据库 ,)除(/)取模(%)。举二个简练的事例。
示例1:在Student表中增多一列,列名叫stu_age,根据Student表的stu_birthday列计算stu_age列并插入数据。(演示插入整列数据的必须要经过的路)
Student表数据如图所示
乐百家lo599 20
推行上面包车型客车言辞

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

结果如图所示
乐百家lo599 21

《Microsoft Sql server 2009 Internals》索引目录:

1.锁

当八个用户同有的时候候对同三个数据开始展览改变时会发生并发难点,使用专门的学业就能够解决那个标题。不过为了防卫别的用户修改另一个还没形成的事体中的数据,就须求在业务中用到锁。
SQL Server 二〇〇八提供了各类锁格局:排他锁,分享锁,更新锁,意向锁,键范围锁,架构锁和大体量更新锁。
查询sys.dm_tran_locks视图能够火速理解SQL Server 2010内的加锁情形。

SELECT * FROM sys.dm_tran_locks;

注:关于锁的知识书中没细讲,就要以往的博客中补充。

3.3.CASE分支语句

示例10:将Student表的学习者,性别和原籍打字与印刷出来,须求籍贯只可以展现省内,省内或自治区。
Student表的多少如图所示
乐百家lo599 22
实践下列语句

SELECT stu_name AS 姓名,stu_sex AS 性别,
(CASE stu_native_place
WHEN '浙江' THEN '省内'
WHEN '内蒙古' THEN '自治区'
WHEN '西藏' THEN '自治区'
WHEN '宁夏' THEN '自治区'
WHEN '新疆' THEN '自治区'
WHEN '广西' THEN '自治区'
ELSE '省外'
END) AS 籍贯 
FROM Student

结果如图所示
乐百家lo599 23

ReCompile   Recompile提示强制SQL Server重新编写翻译叁个布置。那在三个批管理中单单多个说话时特意有用。SQL Server编写翻译T-SQL批管理为叁个Unit,为批管理中的每一种语句决定进行布署,直到全数批管理被编写翻译此前,它不会执行别的语句。那象征要是批处理中包蕴变量表明和赋值,但赋值在编译阶段并不曾实际产生。当下列批管理被优化时,SQL Server并从未为变量定义四个值:

3.4.选取存款和储蓄进度

3.7.GOTO跳转语句

该语句使T-SQL批管理的实践跳转至内定标签。由于该语句破坏结构化语句的结构,尽量少用
示例13:将GOTO作为分支机制
实施上边语句

DECLARE @Counter int;  
SET @Counter = 1;  
WHILE @Counter < 10  
BEGIN   
    SELECT @Counter  
    SET @Counter = @Counter   1  
    IF @Counter = 4 GOTO Branch_One --Jumps to the first branch.  
    IF @Counter = 5 GOTO Branch_Two  --This will never execute.  
END  
Branch_One:  
    SELECT 'Jumping To Branch One.'  
    GOTO Branch_Three; --This will prevent Branch_Two from executing.  
Branch_Two:  
    SELECT 'Jumping To Branch Two.'  
Branch_Three:  
SELECT 'Jumping To Branch Three.';

结果如图所示
乐百家lo599 24
当Counter=4时,施行GOTO语句输出Branch One,实践完那么些讲话之后就打破了WHILE循环,接着实施Branch_One语句中的GOTO,输出Branch Three,结束。

注:在WHILE循环中利用GOTO会打破循环。

示例14:用GOTO语句实现示例1第11中学打字与印刷菱形的成效
进行下列语句

DECLARE @width int,@j int,@i int
SET @width=9--@width为菱形的最大宽度
SET @j=1--@j表示每行打印的“*”符号的个数
SET @i=1--@i表示下一行打印第i行
Set3:PRINT SPACE((@width-@j)/2) REPLICATE('*',@j)--SPACE函数打印n个空字符,REPLICATE打印n个特定字符串
SET @i=@i 1
IF @i<=(@width 1)/2
GOTO Set1
ELSE
GOTO Set2
Set1:
SET @j=@j 2
GOTO Set3
Set2:
SET @j=@j-2
IF @j>=1
GOTO Set3

结果如图所示
乐百家lo599 25

贰个Templete类型的安顿指南,仅仅使用Parameterization Forced或**ParameterizationSimple提醒去重定义数据库的Parameterization**数据库设置。有七个存款和储蓄进程sp_get_query_template用来扭转模板。sp_get_query_template的用法,请看MSDN:
来看四个运用模板指南和威吓参数化的事例,首先排除你的历程缓存,然后实践那八个查询:

本文由乐百家数据库发布,转载请注明来源:《Microsoft Sql server 二〇一〇 Internals》读书笔记