《MS SQL Server 2000管理员手册》系列——20. 认识进阶的 T-SQL[1]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

20. 认识进阶的 T-SQL
INSERT 陈述式
UPDATE 陈述式
DELETE 陈述式
程序设计关键词
本章总结
本章将详细讨论前面章节所使用过用来修改数据的T-SQL陈述式,加上一些可用来控制程序设计流程的T-SQL关键词。这些陈述式及关键词可用于任何可以使用T-SQL的地方,如使用在指令行、指令码、预存程序、批次文件和应用程序中。我们会特别学习有关数据处理的陈述式,如INSERT、UPDATE和DELETE(这些陈述式在 第十三章 曾经提到过),以及程序结构,如IF、WHILE和CASE。
首先我们为范例建立一个数据表,命名为items(请将该数据表建立在MyDB数据库内),以下为建立items数据表的T-SQL命令:
USE MyDB
GO
CREATE TABLE items
(
item_category   CHAR(20)        NOT NULL,
item_id         SMALLINT        NOT NULL,
price           SMALLMONEY      NULL,
item_desc       VARCHAR(30)     DEFAULT 'No desc'
)
GO
item_id数据行适合设成IDENTITY属性(请参阅 第十章的〈增加IDENTITY属性〉 。但由于识别数据行不允许直接插入值,因此这里不使用IDENTITY;这样才可以更有弹性的使用包含INSERT陈述式的范例。
INSERT陈述式
 
在 十三章 曾介绍过INSERT陈述式,可以用来新增数据列至数据表或检视表。以下为INSERT陈述式的基本语法:
INSERT [INTO] table_name [(column_list)] VALUES
    expression | derived_table
INTO关键词和 数据行清单(column_list) 参数可依需要而设定。 数据行清单 参数指定了要插入值的数据行,这些值和表达式中所列的值按顺序对应(也可以只包含值的清单)。
插入资料列
 
下面范例示范如何插入数据列至items数据表。
INSERT INTO items
    (item_category, item_id, price, item_desc)
VALUES ('health food', 1, 4.00, 'tofu 6 oz.')
GO
由于已经替数据表中的每个数据行都指定了一个值,而且依照数据列在数据表中定义的顺序列出对应的值,因此我们也可以不必使用 数据行清单 。但是如果值不是依数据行的顺序排列,输入的数据就可能不正确,或是收到错误讯息。举例来说,试着执行以下的陈述式,就会收到错误讯息:
INSERT INTO items
VALUES (1, 'health food', 4.00, 'tofu 6 oz.')
GO
服务器:讯息245,层级16,状态1,行1
将varchar数值 'health food' 转换成数据型别为smallint的数据行语法错
误。
由于值所放置的顺序不正确,因此数据列并没有被插入,并传回错误讯息。我们尝试把item_id插入item_category数据行,item_category插入item_id数据行(两个数据输入的顺序颠倒),两个不同数据型别的数据并不兼容,当然,如果两个数据行的型别是兼容的,就算数值不同,数据也会被插入,不过数据虽然被插入,却是不正确的数据。
要看看插入的列在数据表中如何显示,使用下面的SELECT陈述式查询资料表,以选择所有的列。
SELECT * from items
GO
会看到以下的结果集:
item_category   item_id price   item_desc
--------------  -------------   ----------
health food     1       4.00    tofu 6 oz.
当建立items数据表时,price数据行定义为允许NULL值,item_desc(描述)数据行的默认值为No desc。如果INSERT陈述式中没有替price数据行指定一个值,新数据列中将插入NULL;如果item_desc数据行没有指定一个值,将插入默认值No desc。
省略资料行值
 
在前面INSERT陈述式范例中,由于price数据行和item_desc数据行设有默认值,所以可以省略数据行的值和名称。如果要省略数据行的值,必须为其它在 数据行清单 的数据行指定参数,否则,列出的值将依照数据表中数据行定义的顺序,分配给各数据行。
举例来说,我们照下面这样输入:在 数据行清单 中少输入了一行价钱,也没有为 数据行清单 指定值。
INSERT INTO items
VALUES ('junk food', 2, 'fried pork skins')
GO
SQL Server会试着把item_desc(值清单中的第三个值)提供的值(fried pork skins)插入price数据行(数据表中的第三字段)。由于price数据行为smallmoney数据型别,fried pork skins是char数据型别,两个不兼容的数据型别,就会产生如下的错误讯息:
服务器:讯息213,层级16,状态4,行1
插入错误:数据行名称或提供的数值数量与数据表定义不相符。
试想如果fried pork skins的数据型别和price数据行兼容,数据就会被不正确的插入,也影响了整个数据表的一致性与正确性。
记住插入数据表或检视表的值的数据型别必须和字段定义的数据型别兼容。还有,如果插入的数据列违反了规则或条件约束,会产生错误讯息,数据列也不会被插入。
为了避免不兼容数据型别的错误发生,指定 数据行清单 以符合应当被插入的值,如下所示:
INSERT INTO items
    (item_category, item_id, item_desc)
VALUES ('junk food', 2, 'fried pork skins')
GO
由于没有指定价格,price数据行将插入NULL值。执行下面的SELECT陈述式:
SELECT * FROM items
应该会出现下述的结果集,结果集中包含已插入的两个数据列,注意price数据列中的NULL。
item_category   item_id price   item_desc
--------------  --------------  -----------------
health food     1       4.00    tofu 6 oz.
junk food       2       NULL    fried pork skins
现在增加另一数据列,不要指定price数据行或item_desc数据行的值,如下所示:
INSERT INTO items
    (item_category, item_id)
VALUES ('toy', 3)
GO
使用下面的查询就可以得到该列的结果集:
SELECT * FROM items WHERE item_id = 3
结果集如下所示:
item_category   item_id price   item_desc
--------------  --------------  ------------
toys    3       NULL    No desc
注意price数据行中的NULL和item_desc资料列中的No desc。这些值可用稍后本章将介绍的UPDATE陈述式变更。
有四种类型的数据行,在没有指定值时,SQL Server会自动提供值给该数据行:分别是 允许NULL值 、 设定默认值 、 IDENTITY属性 和 时间戳记(timestamp) 的数据行。之前讨论过允许NULL值的数据行和含默认值的数据行,若没有指定值会产生的情形(在 第十章 讨论过)。大部分的情况下,是不能手动插入数据值到这两种类型的数据行中。
________________________________________
说明
在数据表中执行INSERT操作时要谨慎。请确定插入的数据正确地放入应当插入的数据行。确定测试了所有的T-SQL程序代码后,再存取或修改数据。
________________________________________
从另一数据表中新增数据列
 
您可以从数据表插入数据列到另一个资料表中。这可以透过在INSERT陈述式中使用衍生资料表,或在传回数据列的预存程序中使用EXECUTE子句来完成。
________________________________________
说明
衍生数据表(Derived Table)即为来自另一个T-SQL陈述式FROM子句中的SELECT陈述式结果集,在 第十四章 中会讨论到衍生数据表。
________________________________________
现在来示范如何使用衍生数据表插入数据。首先建立数据表,命名为two_newest_items,并将item资料表中的两笔数据列插入two_newest_items,以下是建立新数据表所使用的CREATE TABLE陈述式:
CREAT

本文关键:《MS SQL Server 2000管理员手册》系列——20. 认识进阶的 T-SQL
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top