前言:
在创建表并添加数据之后更改或更新表中的数据就成为维护数据库的一个日常过程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