数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

更改数据


发布日期:2023年01月06日
 
更改数据

前言:

在创建表并添加数据之后更改或更新表中的数据就成为维护数据库的一个日常过程Microsoft® SQL Server&#; 提供下列方法更改现有表中的数据

UPDATE 语?

可用来更新表或视图中特定行的数据

数据库应用程序接口 (API)

支持用来更新某个结果集当前位置数据的选项TransactSQL 服务器游标也支持更新游标当前行的数据

UPDATETEXT 语句

可用来更新特定的 ntexttext 和 image 值

更新操作适用于视图和表但是有一些限制条件

使用 UPDATE 语句更改数据

UPDATE 语句可以更改表或视图中单行行组或所有行的数据值还可以用该语句更新远程服务器上的行(使用链接服务器名称或 OPENROWSETOPENDATASOURCE 和 OPENQUERY 函数)前提是用来访问远程服务器的 OLE DB 提供程序支持更新操作引用某个表或视图的 UPDATE 语句每次只能更改一个基表中的数据

UPDATE 语句包括以下主要子句

SET

包含要更新的列和每个列的新值的列表(用逗号分隔)格式为 column_name = expression表达式提供的值包含多个项目如常量从其它表或视图的列中选择的值或使用复杂的表达式计算出来的值

FROM

指定为 SET 子句中的表达式提供值的表或视图以及各个源表或视图之间可选的联接条件

WHERE

指定搜索条件该搜索条件定义源表和视图中可以为 SET 子句中的表达式提供值的行

此更新语句将类别 (category) 中所有 Northwind 产品的价格提高了 %

UPDATE NorthwinddboProducts

SET UnitPrice = UnitPrice *

WHERE CategoryID =

使用 UPDATE 更改数据

TransactSQL(点击查看)

说明 UPDATE 语句有日志记录如果要更改大量的 text 或 image 数据请考虑使用 UPDATETEXT 或 WRITETEXT 语句这两个语句默认情况无日志记录

使用 SET 子句更改数据

SET 子句指定要更改的列和这些列的新值对所有符合 WHERE 子句搜索条件的行将使用 SET 子句中指定的值更新指定列中的值如果没有指定 WHERE 子句则更新所有行例如如果 publishers 表中的所有出版社都将总部迁移到乔治亚 (Georgia) 州的亚特兰大 (Atlanta)则可使用以下 UPDATE 语句

UPDATE publishers SET city = Atlanta state = Georgia

计算列的值可在更新操作中计算和使用例如要使 titles 表中的所有价格加倍titles 表的 price 列可以设置为等于 price *

SET 子句中使用的表达式也可以是只返回一个值的子查询例如如果 Northwind 数据库有一个 OrderSummary 表

UPDATE OrderSummary

SET LastDays =

(SELECT SUM(OrdDetUnitPrice * OrdDetQuantity)

FROM [Order Details] AS OrdDet

JOIN Orders AS Ord

ON (OrdDetOrderID = OrdOrderID

AND OrdOrderDate > DATEADD(ddGETDATE()) )

)

使用 WHERE 子句更改数据

WHERE 子句执行两种功能

指定要更新的行

如果同时指定了 FROM 子句则指定源表中可以为更新语句提供值的行

如果没有指定 WHERE 子句则将更新表中的所有行

以下 UPDATE 语句更改其中一个运输商的名称

UPDATE NorthwinddboShippers

SET CompanyName = United Shippers

WHERE CompanyName = United Packages

使用 FROM 子句更改数据

使用 FROM 子句可将数据从一个或多个表或视图拉入要更新的表中例如当作者 Dirk Stringer 获得一项合同在 titles 表中为他的书 The Psychology of Computer Cooking 指定一个书名标识号时就可以通过为这本最新的书添加书名标识号来更新 titleauthor 表中 Dirk 的行

下例更新 titleauthor 表中 Dirk Stringer 的行以便为作者最新的书添加书名标识号

UPDATE titleauthor

SET title_id = titlestitle_id

FROM titles INNER JOIN titleauthor

ON titlestitle_id = titleauthortitle_id

INNER JOIN authors

ON titleauthorau_id = authorsau_id

WHERE titlestitle = Net Etiquette

AND au_lname = Locksley

使用游标更改数据

ADOOLE DB 和 ODBC 应用程序接口 (API) 支持对结果集内应用程序所处的当前行进行更新其基本过程如下

将结果集的各列绑定到程序变量上

执行查询

执行 API 函数或方法将应用程序定位在结果集的某一行上

使用要更新的列的新数据值填充绑定的程序变量

执行以下函数或方法之一插入行

在 ADO 中调用 Recordset 对象的 Update 方法

在 OLE DB 中调用 IRowsetChange 接口的 SetData 方法

在 ODBC 中调用带 SQL_UPDATE 选项的 SQLSetPos 函数

使用 TransactSQL 服务器游标时可以使用包含 WHERE CURRENT OF 子句的 UPDATE 语句更新当前行使用此子句所做的更改只影响游标所在行如果游标基于某个联接则只修改 UPDATE 语句中指定的 table_name而不影响其它参与该游标的表

USE Northwind

GO

DECLARE abc CURSOR FOR

SELECT CompanyName

FROM Shippers

OPEN abc

GO

FETCH NEXT FROM abc

GO

UPDATE Shippers SET CompanyName = NSpeedy Express Inc

WHERE CURRENT OF abc

GO

CLOSE abc

DEALLOCATE abc

GO

更改 ntexttext 或 image 数据

有多种方法可以在替换整个值时更新行中的 ntexttext 或 image 值

在 UPDATE 语句中指定相对较短的数据其方式与 charnchar 或 binary 数据相同

使用 TransactSQL WRITETEXT 语句

ADO 应用程序可以使用 AppendChunk 方法指定较长的 ntexttext 或 image 数据

OLE DB 应用程序可以使用 ISequentialStream 接口写入新的 ntexttext 或 image 值

ODBC 应用程序可以使用 SQLPutData 的执行中的数据形式写入新的 ntexttext 或 image 值

DBLibrary 应用程序可以使用 dbwritetext 函数

Microsoft® SQL Server&#; 还支持仅更新 ntexttext 或 image 值的一部分在 DBLibrary 中该操作可以使用 dbupdatetext 函数实现

所有其它应用程序和 TransactSQL 脚本批处理存储过程和触发器可以使用 UPDATETEXT 语句只更新 ntexttext 或 image 列的一部分

以下脚本显示同时使用 UPDATETEXT 和 PATINDEX 查找和替换 text 值中特定字符串的方法

USE Northwind

GO

CREATE TABLE TextParts (ColA INT PRIMARY KEY ColB TEXT)

GO

INSERT INTO TextParts

VALUES(

Sample string START TAG Text to go END TAG Trailing text)

GO

DECLARE @PtrVar BINARY()

DECLARE @InsertPos INT

DECLARE @DeleteLen INT

SELECT @PtrVar = TEXTPTR(ColB)

@InsertPos = (PATINDEX(%START TAG% ColB) + )

@DeleteLen = (

PATINDEX(%END TAG% ColB)

( PATINDEX(%START TAG% ColB) +

+ /* allow for blanks */ )

)

FROM TextParts

WHERE ColA =

UPDATETEXT TextPartsColB

@PtrVar

@InsertPos

@DeleteLen

WITH LOG

The new text

GO

SELECT * FROM TextParts

GO

由最后的 SELECT 语句得出的结果集为

ColA ColB

Sample string START TAG The new text END TAG Trailing text

上一篇:数据仓库白皮书

下一篇:数据仓库的概念