微软认证考试70-461 Modify Data 数据修改 --24%比重--(2)
附注:微软认证考试70-461范围
- Create Database Objects创建数据库对象 (24%)Work with Data数据处理 (27%)Modify Data数据修改 (24%)Troubleshoot & OptimizeUPDATE 语句总是在其修改的表上获取排他 (X) 锁并在事务完成之前持有该锁。 有了排他锁,其他事务都不可以修改数据。 您可以指定表提示,以便通过指定其他锁定方法来覆盖 UPDATE 语句的持续时间的这一默认行为,但只建议经验丰富的开发人员和数据库管理员将提示用作最后的手段来执行。有关详细信息,请参阅表提示 (Transact-SQL)。
基本UPDATE语句更新所有行UPDATE 表名 SET 列名=值更新多列所有行UPDATE 表名 SET 列名1=值1,列名2=值2更新指定行UPDATE 表名 SET 列名=值 WHERE...与JOIN一起使用UPDATE 表名1 SET 列名=值 FROM 表名1 JOIN 表名2 ON...随机更新5行UPDATE TOP(5) 表名 SET 列名=值更新前5行UPDATE 表名 SET 列名=值 WHERE ID IN(SELECT TOP(5) ID FROM 表名 ORDER BY ID)这里假设ID为主键SET指定子查询UPDATE 表名 SET 列名=(SELECT...)用默认值更新UPDATE 表名 SET 列名= DEFAULT更新视图只能偿试更新一个基表中的列使用 WHERE CURRENT OF 子句以下示例使用 WHERE CURRENT OF 子句来只更新游标位于其上的行。 如果游标基于某个联接,则只修改 UPDATE 语句中指定的 其他参与该游标的表不会受到影响。
DECLARE complex_cursor CURSOR FOR
SELECT a.BusinessEntityID
FROM HumanResources.EmployeePayHistory AS a
WHERE RateChangeDate <>
(SELECT MAX(RateChangeDate)
FROM HumanResources.EmployeePayHistory AS b
WHERE a.BusinessEntityID = b.BusinessEntityID) ;
OPEN complex_cursor;
FETCH FROM complex_cursor;
UPDATE HumanResources.EmployeePayHistory
SET PayFrequency = 2
WHERE CURRENT OF complex_cursor;
CLOSE complex_cursor;
DEALLOCATE complex_cursor;
使用OUTPUTUPDATE TEST SET NAME='JACKKKKKKKKKKKKKKKKK'
OUTPUT inserted.Name,deleted.Name
WHERE ID=1
也可以如同INSERT示例一样,将OUTPUT值插入变量。更新大型对象数据类型使用包含 .WRITE 的 UPDATE 来修改 nvarchar(max) 列中的数据
UPDATE DocumentSET DocumentSummary .WRITE (N'features',28,10)28是DocumentSummary字段的开始位置,10是要替换的字符长度。
使用包含 .WRITE 的 UPDATE 在 nvarchar(max) 列中添加和删除数据-- 不能使用 .WRITE 子句修改 NULL 列,因此先使用临时数据填充该列.
UPDATE Document
SET DocumentSummary = N'替换NULL'
WHERE ...;
-- 再用.WRITE替换值。方法: 开始位置0,长度设为NULL
UPDATE Document
SET DocumentSummary .WRITE(N'新值',0,NULL)
WHERE ...;
-- 追加数据
-- 方法:开始位置设为 NULL,长度设为0.
UPDATE Document
SET DocumentSummary .WRITE (N'追加数据', NULL, 0)
WHERE ...;
-- 删除从指定位置开始的所有字符
-- 方法:值设为NULL,长度设为0.
UPDATE Document
SET DocumentSummary .WRITE (NULL, 56, 0)
WHERE ...;
从位置56开始的字符将被全部删除
-- 删除指定段数据.
UPDATE Document
SET DocumentSummary .WRITE ('',9, 12)
WHERE ...;
从位9到21的数据将被删除
使用包含 OPENROWSET 的 UPDATE 修改 varbinary(max) 列
UPDATE Production.ProductPhotoSET ThumbNailPhoto = ( SELECT * FROM OPENROWSET(BULK 'c:\Tires.jpg', SINGLE_BLOB) AS x )WHERE ProductPhotoID = 1;使用 UPDATE 来修改 FILESTREAM 数据
UPDATE Archive.dbo.RecordsSET [Chart] = CAST('Xray 1' as varbinary(max))WHERE [SerialNumber] = 2;通过使用提示覆盖查询优化器的默认行为指定表提示UPDATE Product
WITH (TABLOCK)
SET ListPrice = ListPrice * 1.10
WHERE ...;
指定查询提示以下示例在 UPDATE 语句中指定查询提示OPTIMIZE FOR (@variable)。 此提示指示查询优化器在编译和优化查询时对局部变量使用特定值。 仅在查询优化期间使用该值,在查询执行期间不使用该值。
CREATE PROCEDURE Production.uspProductUpdate@Product nvarchar(25)ASSET NOCOUNT ON;UPDATE Production.ProductSET ListPrice = ListPrice * 1.10WHERE ProductNumber LIKE @ProductOPTION (OPTIMIZE FOR (@Product = 'BK-%') );GO-- Execute the stored procedure EXEC Production.uspProductUpdate 'BK-%';
Delete语句Delete FROM 表名 WHERE...对于TOP,OUTPUT,关联表,游标的使用况与上面类似。
参考:http://msdn.microsoft.com/zh-cn/library/ms174335(v=sql.110).aspx
http://msdn.microsoft.com/zh-cn/library/ms177523(v=sql.110).aspx
http://msdn.microsoft.com/zh-cn/library/ms189835(v=sql.110).aspx