2008从入门到精通

目录

目录

约束

XML查询技巧

XML文档以四个纯文本的款式存在,首要用于数据存储。不但有助于客户读取和平运动用,而且使修改和维护变得更便于。

  • 1.利用Transact-SQL语言编制程序
    • 1.1.多少定义语言DDL
    • 1.2.数量操纵语言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.运算符的事先级
  • 2008从入门到精通。3.垄断(monopoly)语句
    • 3.1.BEGIN
      END语句块
    • 3.2.IF
      ELSE语句块
    • 3.3.CASE分支语句
    • 3.4.WHILE语句
    • 3.5.WAITFO普拉多推迟语句
    • 3.6.RETU梅赛德斯-AMGN无条件退出语句
    • 3.7.GOTO跳转语句
    • 3.8.T宝马7系Y
      CATCH错误管理语句
  • 4.常用函数
    • 4.1.数据类型调换函数
  • 1.触发器
    • 1.1.DDL触发器
    • 1.2.DML触发器
    • 1.3.创造触发器
      • 1.3.1.创建DML触发器
      • 1.3.2.创建DDL触发器
      • 1.3.3.嵌套触发器
      • 1.3.4.递归触发器
    • 1.4.管制触发器
主关键字约束(Primary Key Constraint)

用来钦赐表中的一列或几列组合的值在表中颇有唯一性。创立主键的指标是让外键来援引。

XML数据类型

XML是SQL
Server中放置的数据类型,可用来SQL语句可能当做存款和储蓄进度的参数。用户能够直接在数据库中存款和储蓄、查询和治本XML文件。XML数据类型还是能保留整个XML文书档案。XML数据类型和任何数据类型空中楼阁根本上的歧异,能够把它用在其余日常SQL数据类型能够利用的地点。
示例1:创制一个XML变量并用XML填充

DECLARE @doc XML
SELECT @doc='<Team name="Braves" />';

示例2:创制XML数据类型列

CREATE TABLE t1(
column1 INT,
column2 XML,
CONSTRAINT pk_column1 PRIMARY KEY(column1));

在上头的身体力行中,column2列是XML数据类型列。
示例3:不能够将XML数据类型列设置为主键或外键

CREATE TABLE t1(
column1 INT,
column2 XML,
CONSTRAINT pk_column1 PRIMARY KEY(column2));

实施上边的代码,报错如下:
消息1919,级别16,状态1,第1 行
表’t1′ 中的列’column2′ 的门类无法用作索引中的键列。
消息1750,级别16,状态0,第1 行
不能成立约束。请参阅前边的失实音信。
XML数据类型的采纳范围
独有ST瑞鹰ING数据类型手艺转变来XML。
XML列不能够使用于GROUP BY语句中
XML数据类型存款和储蓄的数额无法超越2GB
XML数据类型字段不可能被设置成主键大概外键或称为其一部分。
Sql_variant数据类型字段的选拔不能把XML数据类型作为种子项目。
XML列不能够内定为独一的。
COLLATE子句不可能被采取在XML列上。
存款和储蓄在数据库中的XML仅协助128级的档期的顺序。
表中最对只好具备三19个XML列。
XML列不可能投入到法则中。
独一可使用于XML列的内置标量函数是ISNULL和COALESCE。
全部XML数据类型列的表不能够有七个超越15列的主键。

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

纵然SQL Server
二〇〇八提供了图形化分界面,但唯有一种Transact-SQL语言能够一向与数据库引擎举行交互。依据施行效果特色能够将Transact-SQL语言分成3大类:数据定义语言DDL,数据操纵语言DML,数据调控语言DCL。

1.触发器

触发器是一种奇特的储存进程,与表紧凑关联。

Primary Key的创办方式

在创造表时制造Primary Key

CREATE TABLE table1(
    t_id VARCHAR(12) ,
    t_name VARCHAR(20),
    t_phone VARCHAR(20),
    CONSTRAINT t_idss PRIMARY KEY(t_id)
);

对t_id列创立主键,约束名称为t_idss。

类型化的XML和非类型化的XML

可以创设xml类型的变量,参数和列,可能将XML框架结构集合和xml类型的变量、参数或列关联,这种情景下,xml数据类型实例称之为类型化xml实例。不然XML实例称为非类型化的实例。

1.1.数目定义语言DDL

是最基础的Transact-SQL语言类型,用来创立数据库和开创,修改,删除数据库中的各样对象,为别的语言的操作提供对象。比方数据库,表,触发器,存款和储蓄进度,视图,函数,索引,类型及顾客等都是数据库中的对象。常见的DDL语句包罗

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

1.1.DDL触发器

当服务器或数据库中生出多少定义语言(DDL)事件时将被调用。如CREATE,ALTERDROP等操作。假诺要举行以下操作,可以应用DDL触发器:

  • 防卫对数据库架构举办更动
  • 指望数据库中产生一些情形以响应数据库架构中的改变
  • 要记录数据库架构中的改动或事件
删除Primary Key
ALTER TABLE table1
DROP CONSTRAINT t_idss;

自律名与列名不相同,此处填写约束名

XML数据类型方法

XML数据类型共有5种格局
query():实践叁个XML查询并重返查询结果(重返二个XML数据类型)。
示例4

DECLARE @xmlDoc XML--声明XML类型的变量@xmlDoc
SET @xmlDoc='<students>
    <class name="数学" NO="8501">
        <student>
            <name>李林</name>
            <sex>男</sex>
            <age>16</age>
            <address>江苏</address>
        </student>
    </class>
</students>'--将XML实例分配给变量@xmlDoc
SELECT @xmlDoc.query('/students/class/student') AS test
--用query()查询@xmlDoc变量实例中标签<student>的子元素

询问结果如图所示
图片 1
点击查询结果
图片 2
如想查询标签

DECLARE @addr XML--声明一个XML类型变量@addr
SET @addr='/students/class/student'
SELECT @addr.exist('/students/class="江苏"') AS 返回值

结果如图所示
图片 3

注:exsit()方法的参数不必做准确定位

Value():总计三个询问并从XML中回到一个轻便的值(只好回去单个值,且该值为非XML数据类型)。
Value()方法有2个参数XQuery和SQLType,XQuery参数表示命令要从XML实例之中查询数据的具体地点,SQLType参数表示value()方法再次来到的值的主推数据类型。
示例6

DECLARE @xmlDoc XML--声明XML类型的变量@xmlDoc
DECLARE @classID INT--声明INT类型的变量@classID
SET @xmlDoc='<students>
    <class name="数学" NO="8501">
        <student>
            <name>李林</name>
            <sex>男</sex>
            <age>16</age>
            <address>江苏</address>
        </student>
    </class>
</students>'--将XML实例分配给变量@xmlDoc
SET @classID=@xmlDoc.value('(/students/class/@NO)[1]','INT')
--将value()方法返回值赋值给变量@classID
SELECT @classID AS classID

询问结果如图所示
图片 4

注:SQLType无法是XML数据类型,公共语言运转时(CLCR-V)客户定义类型,image,text,ntext或sql_variant数据类型,但能够是客户自定义数据类型SQL。

Modify():在XML文书档案的适度地方实践三个修改操作。它的参数XML_DML代表一串字符串,根据此字符串表明式来更新XML文书档案的开始和结果。
示例7:在@xmlDoc的实例中,成分

DECLARE @xmlDoc XML--声明XML类型的变量@xmlDoc
SET @xmlDoc='<students>
    <class name="数学" NO="8501">
        <student>
            <name>李林</name>
            <sex>男</sex>
            <age>16</age>
            <address>江苏</address>
        </student>
    </class>
</students>'
SELECT @xmlDoc AS '插入节点前信息'
SET @xmlDoc.modify('insert <学历>本科</学历> after (students/class/student/age)[1]')
SELECT @xmlDoc AS '插入节点后信息'

查询结果插入节点后音信如图所示
图片 5

注:modify()方法的参数中insert和别的重大字必须小写,不然会报错

Nodes():允许把XML分解到二个表结构中。此办法将XML数据类型实例拆分为关周到据,并赶回包涵原始XML数据的行集。
示例8:依旧用@locat参数的实例来演示

DECLARE @locat XML--声明XML变量@locat
SET @locat=
'<root>
    <location locationID="8">
        <step>8的步骤</step>
        <step>8的步骤</step>
        <step>8的步骤</step>
    </location>
    <location locationID="9">
        <step>9的步骤</step>
        <step>9的步骤</step>
        <step>9的步骤</step>
    </location>
    <location locationID="10">
        <step>10的步骤</step>
        <step>10的步骤</step>
        <step>10的步骤</step>
    </location>
    <location locationID="11">
        <step>11的步骤</step>
        <step>11的步骤</step>
        <step>11的步骤</step>
    </location>
</root>'--@locat变量的实例

SELECT T.Loc.query('.') AS result
FROM @locat.nodes('/root/location') T(Loc)
GO

询问结果如下图所示
图片 6

1.2.数据垄断(monopoly)语言DML

是用来操纵表和视图中的数据的讲话,比方查询数据(SELECT),插入数据(INSERT),更新数据(UPDATE)和删除数据(DELETE)等。

1.2.DML触发器

当数据库服务器中发生多少操作语言(DML)事件时将被调用。如INSERT,DELETE,UPDATE等操作。将DML触发器和触发语句作为可在触发器内回滚的单个事务对待,假设检验到错误,则整个事情回滚。DML触发器在弹指间地点异常的低价:

  • 可完成数据库相关表之间的级联退换
  • 能够幸免恶意或不当的DML说话事件,并强制推行比CHECK封锁更加的复杂的任何限制
  • 能够评估数据修改前后表的景观,并基于该距离选拔措施

二个表中的八个同类DML触发器,允许用四个不等的操作来响应同多个修改语句
SQL Server
2008
为种种触发器创造了2个独特的表:INSERTED表和DELETED表。那是五个逻辑表,由系统来创造和保安,客商无法对她们开展修改。它们贮存在内存中,实际不是在数据库中,并且组织与被DML触发器成效的表的结构一样。
INSERTED表中寄放了由施行INSERTUPDATE语句而插入的具备行,在进行INSERTUPDATE说话时,新的就要同反常候被插入到触发器作用的表和INSERTED表中。INSERTED表中的行是触发器作用的表中央银行的别本。
DELETED表中存放了由推行DELETEUPDATE语句而除去的兼具行,在推行DELETEUPDATE讲话时,被剔除的将要由触发器作用的表中被挪动到DELETED表,三个表中不会有重复行。

向已有表中增多Primary Key
ALTER TABLE table1
ADD CONSTRAINT t_idss
PRIMARY KEY(t_id);

XQuery简介

XQuery是一种查询语言,能够查询结构化大概半结构化的数目。SQL Server
贰零零捌中对XML数据类型提供了辅助,能够存款和储蓄XML文书档案,然后使用XQuery语言进行询问。

1.3.数额调节语言DCL

关系到权力管理的语言称为数据调控语言,首要用来推行有关安全治本的操作。如授予权限(GRANT),收回权限(REVOKE),拒绝授予主体权限,并防御主体通过组或剧中人物成员持续权限(DENY

1.3.创制触发器

加上Primary Key的另一种示例
ALTER TABLE Products
ADD PRIMARY KEY(prod_id);

虽说上述代码运转没难题,查看表格设计也得以看见Primary
Key设置成功,不过在剔除Primary Key操作时会提醒:
消息3728,级别16,状态1,第1 行
‘prod_id’ 不是束缚。
消息3727,级别16,状态0,第1 行
未能删除约束。请参阅前边的错误消息。
案由是增多Primary
Key语句中平素不用CONSTRAINT指明约束名,系统自动生成了主键名和平契约束名,要先查看主键名和平公约束名,删除时填写的也是束缚名。
这种意况的不易删除方法

ALTER TABLE Products
DROP CONSTRAINT CK__Products__prod_p__1A14E395;
ALTER TABLE Products
DROP CONSTRAINT PK__Products__56958AB222AA2996;

FOR XML子句

通过在SELECT语句中运用FO锐界XML子句能够把数据库表中的数据检索出来并生成XML格式。SQL Server
2010支持FO奥迪Q3XML的两种方式,分别是RAW形式,AUTO情势,EXPLICIT方式和PATH方式。

1.4.Transact-SQL语言基础

1.3.1.创建DML触发器

多列组合增多主键约束
CREATE TABLE table1(
    t_id VARCHAR(12),
    s_id VARCHAR(20),
    score FLOAT,
    CONSTRAINT ts_id PRIMARY KEY(t_id,s_id)
);
FOR XML RAW

将表转产生元素名称是row,属性名称叫列名或许列的别称。
示例9:将Student表调换为XML格式(FOEnclave XML RAW)
Student表的数目如图所示
图片 7
实行语句:

SELECT * FROM Student FOR XML RAW;

查询结果如图所示
图片 8
图片 9

1.4.1.常量与变量

常量比很少说。在SQL Server
二零一零中,存在三种变量。一种是系统定义和维护的全局变量,一种是客户定义用来保存中间结果的一对变量。

1.3.1.1.INSERT触发器

示例1:成立一个触发器Automatic_division,当在Student表中插入一条学生新闻时,触发器依据入学分数(stu_enter_score)对学生展开活动分班,并在class_student表中插入一条记下。
分班须求:
|Stu_enter_score |Class_id |Class_name|
|——————-|——————|————–|
|stu_enter_score>=700| 01| 创新A班|
|650<=Stu_enter_score<700| 02| 重点B班|
|600<=Stu_enter_score<650| 03| 提高C班|
|550<=Stu_enter_score<600| 04| 普通D班|
|500<=Stu_enter_score<550| 05| 普通E班|
|Stu_enter_score<500| 06| 普通F班|
实行下列语句

CREATE TRIGGER automatic_division
ON student--新建一个检测student表的触发器,命名automatic_division
FOR INSERT--检测到INSERT操作时触发器工作
AS
DECLARE @score INT,@stu_no VARCHAR(8),@class_id CHAR(2)
--声明三个变量
DECLARE stu_cursor CURSOR LOCAL FORWARD_ONLY--声明一个指向inserted表的局部游标stu_cursor
FOR SELECT stu_no,stu_enter_score FROM inserted
OPEN stu_cursor--打开游标
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--将游标指向inserted表的第一个数据并把游标指向的stu_no和stu_enter_score值分别赋值给@stu_no和@score
WHILE @@FETCH_STATUS=0--开始循环
BEGIN
BEGIN--先对@score的数值范围做判断,以确定该学生的班级编号
IF @score>=700
SET @class_id='01'
ELSE IF @score<700 AND @score>=650
SET @class_id='02'
ELSE IF @score<650 AND @score>=600
SET @class_id='03'
ELSE IF @score<600 AND @score>=550
SET @class_id='04'
ELSE IF @score<550 AND @score>=500
SET @class_id='05'
ELSE
SET @class_id='06'
END
--判断结束
INSERT INTO class_student(class_id,stu_no)
VALUES(@class_id,@stu_no)--将数据插入到class_student表中
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--将游标移向inserted表的下一个数据,重复这个循环
END--循环结束
CLOSE stu_cursor--关闭游标
DEALLOCATE stu_cursor--释放游标资源
GO

注解朝码是或不是正确
student表中插入数据,并查阅class_student表中的数据是还是不是准确

INSERT INTO student(stu_no,stu_name,stu_sex,stu_enter_score)
VALUES('20180001','邹莉莉','女','389'),
('20180002','万兴','男','701'),
('20180003','孙伟','男','652'),
('20180004','温佳静','女','676'),
('20180005','姜立夫','男','542')

Class_student表中的数据如图所示
图片 10
游标示例2:对student表中还未分班的学习者开展分班
Student表中的数据如图所示
图片 11
其中stu_no20180001~20180005的学习者一度在示例1中分班,剩下的学员全都未分班。
施行下列语句

ALTER TABLE student
ADD stu_division_state bit--为student表新建一列记录是否已分班,true表示已分班
GO
DECLARE stu_class_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no FROM class_student
--新建游标stu_class_cursor指向class_student表的所有数据
OPEN stu_class_cursor--打开游标
DECLARE @stu_no VARCHAR(8)
FETCH NEXT FROM stu_class_cursor INTO @stu_no
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE student
SET stu_division_state=1
WHERE stu_no=@stu_no
FETCH NEXT FROM stu_class_cursor INTO @stu_no
END
CLOSE stu_class_cursor--关闭游标
DEALLOCATE stu_class_cursor--释放游标资源
---所有学生是否分班已经全部记录在stu_division_state中
GO
DECLARE @stu_no VARCHAR(8),@score INT,@class_id CHAR(2)
DECLARE stu_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no,stu_enter_score FROM student WHERE stu_division_state IS NULL
--新建student表的游标stu_cursor,指向所有未分班学生
OPEN stu_cursor--打开游标
FETCH NEXT FROM stu_cursor INTO @stu_no,@score
WHILE @@FETCH_STATUS=0--循环开始
BEGIN
BEGIN--先对@score的数值范围做判断,以确定该学生的班级编号
IF @score>=700
SET @class_id='01'
ELSE IF @score<700 AND @score>=650
SET @class_id='02'
ELSE IF @score<650 AND @score>=600
SET @class_id='03'
ELSE IF @score<600 AND @score>=550
SET @class_id='04'
ELSE IF @score<550 AND @score>=500
SET @class_id='05'
ELSE
SET @class_id='06'
END
INSERT INTO class_student(class_id,stu_no)
VALUES(@class_id,@stu_no)--将数据插入到class_student表中
UPDATE student--将student表的stu_division_state改成已分班
SET stu_division_state=1
WHERE stu_no=@stu_no
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--将游标移向inserted表的下一个数据,重复这个循环
END--循环结束
CLOSE stu_cursor
DEALLOCATE stu_cursor
GO

结果如图所示
Student表的数据
图片 12
Class_student表的数目
图片 13
至此Student表中有着学员都已经分班
为了今后福利,能够将游标示例2中的代码稍作修改封装成多少个顾客自定义存款和储蓄进程
仓库储存过程示例3
修改后的代码如下

CREATE PROCEDURE student_division
AS
BEGIN
UPDATE student
SET stu_division_state=0--先将student表中所有学生的分班情况都标成未分班

DECLARE stu_class_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no FROM class_student
--新建游标stu_class_cursor指向class_student表的所有数据
OPEN stu_class_cursor--打开游标
DECLARE @stu_no VARCHAR(8)
FETCH NEXT FROM stu_class_cursor INTO @stu_no
WHILE @@FETCH_STATUS=0
BEGIN
UPDATE student
SET stu_division_state=1
WHERE stu_no=@stu_no--利用游标找出student表中已分班的学生并标记分班状态
FETCH NEXT FROM stu_class_cursor INTO @stu_no
END
CLOSE stu_class_cursor--关闭游标
DEALLOCATE stu_class_cursor--释放游标资源
---所有学生是否分班已经全部记录在stu_division_state中

DECLARE @score INT,@class_id CHAR(2)
DECLARE stu_cursor CURSOR LOCAL FORWARD_ONLY
FOR SELECT stu_no,stu_enter_score FROM student WHERE stu_division_state=0
--新建student表的游标stu_cursor,指向所有未分班学生
OPEN stu_cursor--打开游标
FETCH NEXT FROM stu_cursor INTO @stu_no,@score
WHILE @@FETCH_STATUS=0--循环开始
BEGIN
BEGIN--先对@score的数值范围做判断,以确定该学生的班级编号
IF @score>=700
SET @class_id='01'
ELSE IF @score<700 AND @score>=650
SET @class_id='02'
ELSE IF @score<650 AND @score>=600
SET @class_id='03'
ELSE IF @score<600 AND @score>=550
SET @class_id='04'
ELSE IF @score<550 AND @score>=500
SET @class_id='05'
ELSE
SET @class_id='06'
END
INSERT INTO class_student(class_id,stu_no)
VALUES(@class_id,@stu_no)--将数据插入到class_student表中
UPDATE student--将student表的stu_division_state改成已分班
SET stu_division_state=1
WHERE stu_no=@stu_no
FETCH NEXT FROM stu_cursor INTO @stu_no,@score--将游标移向inserted表的下一个数据,重复这个循环
END--循环结束
CLOSE stu_cursor
DEALLOCATE stu_cursor
END
GO

注:和游标示例2的代码相比较,示例3的代码增多了将兼具学员分班状态标识为0的进程,去掉了增加stu_division_state列的长河,但对原本已部分学生的分班状态赋值这么些手续未有删去,而是进行双重校验。而且删除了两段代码中的GO和第二段用于给学员分班的代码中对@stu_no变量的重新证明。

student表插入数据并运营student_division的蕴藏进度

注:对student表插入数据前应先禁止使用示例1的触发器automatic_division

实施下列语句

ALTER TABLE student DISABLE TRIGGER automatic_division
--禁用automatic_division触发器
INSERT INTO student(stu_no,stu_name,stu_sex,stu_enter_score,stu_division_state)
VALUES('20180006','王洋','男','724',NULL),
('20180007','易阳','男','713',NULL),
('20180008','孙浩','男','584',NULL),
('20180009','张秋燕','女','420','False'),
('20180010','胡燕','女','527','True')

Student表的多寡如图所示,红框内正是本身正好插入还未分班的数据,当中2018000920180010那七个学生的分班状态被小编误标成FalseTrue
图片 14
推行存款和储蓄进程

EXEC dbo.student_division

结果如图所示
Student表的数量(分班状态都为true了)
图片 15
Class_student表的数码
图片 16

外关键字约束(Foreign Key Constraint)

概念了表之间的涉嫌,用来维护四个表之间的一致性的涉及。
在创制表时成立Foreign Key Constraint

CREATE TABLE table2(
    s_id VARCHAR(20),
    s_name VARCHAR(12),
    s_tellphone VARCHAR(11),
    s_address VARCHAR(20),
    CONSTRAINT PK_s_id PRIMARY KEY(s_id),
);--首先新建table2,设置s_id为主键

CREATE TABLE table1(
    t_id VARCHAR(12),
    s_id VARCHAR(20),
    score FLOAT,
    CONSTRAINT pk_ts_id PRIMARY KEY(t_id,s_id),--新建table1,对t_id和s_id设置联合主键,键名pk_ts_id
    CONSTRAINT fk_s_id FOREIGN KEY(s_id)--对s_id设置外键fk_s_id
    REFERENCES table2(s_id)--外键fk_s_id外键关联table2的列s_id
    ON DELETE CASCADE--设置在table1的s_id删除时table2的s_id同时删除
    ON UPDATE CASCADE--设置在table1的s_id更新时table2的s_id同时更新
);

注:对table1设置外键关联table2,在插入数据时索要先插入table2的数量,才具成功插入table1的数目。更动table2.s_id数据,table1.s_id数据也会活动退换。不过改造table1.s_id数据,实施时报外键龃龉。同理可得对table1设置外键关联table2后,table1的数目跟着table2走,不可能反着来。

丰硕和删除了那个之外键约束同主键。

FOR XML AUTO

使用表名称作为成分名称,使用列名称作为质量名称,SELECT关键字后边列的顺序用于XML文书档案的档次。
示例10:将Student表转变为XML格式(FO锐界 XML AUTO)
进行语句:

SELECT * FROM Student FOR XML AUTO;

查询结果如图所示
图片 17
图片 18

admin

网站地图xml地图