SQL Server和T-SQL数据操纵(一)

日期: 2008-11-16 作者:SearchSQLServer.com翻译:April 来源:TechTarget中国 英文

设计   除了那些用来保存数据和实现数据完整性的对象之外,SQL Server还提供了一些允许你编写数据操纵代码的对象。我们可以用这些对象在数据库里进行数据插入、更新、删除或者读数据,还可以利用它们来实施事物规则和实现高级数据完整性。你能在SQL Server中构建“应用软件”。一般这些应用软件都很小并且通常以某种方式提供服务或更大的应用软件操纵数据。

  存储过程   最常见的情况是,我们SQL Server中编写代码时,你就会同时进行存储程序的操作(SP)。SP很容易编写,还能保存T-SQL代码。SP是在视图中进行汇编的,在第一次执行计划时SP和视图很相似。二者之间的区别就是:除进行数据抽……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

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

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

设计

  除了那些用来保存数据和实现数据完整性的对象之外,SQL Server还提供了一些允许你编写数据操纵代码的对象。我们可以用这些对象在数据库里进行数据插入、更新、删除或者读数据,还可以利用它们来实施事物规则和实现高级数据完整性。你能在SQL Server中构建“应用软件”。一般这些应用软件都很小并且通常以某种方式提供服务或更大的应用软件操纵数据。

  存储过程

  最常见的情况是,我们SQL Server中编写代码时,你就会同时进行存储程序的操作(SP)。SP很容易编写,还能保存T-SQL代码。SP是在视图中进行汇编的,在第一次执行计划时SP和视图很相似。二者之间的区别就是:除进行数据抽取之外,SP还能执行T-SQL代码和参数。它们和其他程序语言中的模块很相似。你可以用一个程序,并让它执行操作,或能传递参数并从SP中返回参数。

  和列一样,我们配置参数来允许一个具体的数据类型。 所有相同的数据类型都用于配置参数,它们限定了一种你能将参数迁移到SP的数据类型。参数一般有两种类型:输入和输出。输入参数给SP提供它们在执行参数期间的数据,输出参数则将数据返回到流程程序(calling process)。除了检索数据外,输出参数还可以用来给SP提供数据。你可以在设计员工数据SP时做这些事情,如果确实有这个员工就进行数据更新,如果这个员工不存在就插入一个新纪录。在这种情况下,你可以用一个EmployeeID参数映射员工主键。该参数会接受你想更新的这个员工的ID,还将在你插入一个新员工时返回这个新员工的ID。

  SP还有一个返回值,该返回值能将整数返回到calling process中。返回值通常用于给calling process提供有关存储程序操作成功的信息。返回值和输出参数之间的不同就是返回值没有名称并且你只能在每个SP中获得一个返回值。此外,即使你没有指定返回值,SP也总是在返回值中返回一个整数。通过默认,一旦你指定了其他的东西,SP就返回0 (zero)。正是这个原因,指定成功操作的时候就会用到0,非零值就会用来返回错误条件。

  SP有很多用途,最常见的就是管理输入和恢复数据。通常SP用来映射你存储的实体。如果在你的数据库中有一个学生数据,你也许就名为sp_add_student、sp_update_student以及sp_retrieve_student_data.的一些SP。这些SP就会包含允许你指定最终要写入表的所有学生数据。

  如同视图一样,SP为用户简化了数据库的复杂性,比仅仅进行重复性运行T-SQL要更加有效。另外,如果你要更改你的数据库,用SP你就不需要更新应用软件代码。只要SP接受相同的参数并在你更改之后返回同样的数据,你的应用软件代码就不需要改变。在第11章中我们将详细介绍使用存储程序的方法。

  自定义函数

  和程序语言一样,T-SQL提供了自定义函数(UDFs)。UDFs用于获取输入参数、执行操作并将结果返回到calling process中。听起来是不是和存储程序一样?的确是一样,但是它们之间还有一些重大的区别。第一件事就是你要注意UDFs的命名方法。我们看一看下面命名SP的代码。


DECLARE @num_in_stock int
EXEC sp_check_product_stock @sku = 4587353, 
@stock_level = @num_in_stock OUTPUT 
PRINT @num_in_stock

  你还会发现:第一、你必须用一个变量来保存存储程序的返回值。如果你之后是用的这个值,你就需要使用这个变量,这很简单。现在我们调用UDF返回同样的信息:


DECLARE @num_in_stock int 
SET @num_in_stock = dbo.CheckProductStock (4587353) 
PRINT @num_in_stock

  现在我们开看看调用返回相同信息的UDF。

  这个代码看起来很相像,但是调用的这个函数和其他程序语言中调用的函数一样。你可能还会反问自己:“它们之间有什么区别?”除了调用函数并将返回值迁移到变量中之外,你还能够调用内置于其他代码中的UDFs。想一想以下返回新的employee ID的UDF例子。这个调用函数就内置于employee表的插入语句中。用这种方法调用UDFs就能避免写一些多余的代码来存储后来用到的返回变量。


INSERT INTO employee (employeeid, firstname, lastname) 
VALUES (dbo.GetNewEmployeeID(), 'Eric', 'Johnson')

  第一点很大的区别就是UDFs是它们返回的一种数据。 能够返回单个值的UDFs叫做纯量函数。这种函数返回的数据可以定义为除text、ntext、image和 timestamp之外的任何一种数据类型。扼要说来,我们刚才的所有的例子都包括纯量函数值。

  UDFs还能够定义为运算符计算表值函数(TVF):即能够返回表数据类型。另外,TVF还能在其他T-SQL代码中调用,并且能当作表来用。我们能运用以下的代码将employee ID迁移到这个函数中并返回表。


SELECT * FROM dbo.EmployeeData(8765448)

  你还可以将计数表函数和其他函数或基表相连。最初开发人员用UDFs编写数据库的T-SQL代码,但是你还可以用它来实施模块中的事务规则。UDFs还能够用于检查约束或者触发器帮助你保持数据的完整性。

  触发器

  触发器和约束是物理数据库中加强数据完整性和事务规则两种最普遍的方法。触发器用T-SQL脚本保存。和存储程序很相似,我们运行触发器就是为对表或试图发出DML语言(而不是SELECT语言)。SQL Server中有两种DML触发器。

翻译

April
April

相关推荐