app开发者平台在数字化时代的重要性与发展趋势解析
723
2022-12-02
学习笔记—— 一些UPDATE语句
UPDATE语句原来还有许多种写法,有的还很复杂,孤陋寡闻的我甚至闻所未闻。幸甚至哉,记而志之。
0、UPDATE 表名 SET 字段。。。 FROM 。。。的方式
4、使用包含 OPENROWSET 的 UPDATE 修改 varbinary(max) 列以下示例将 varbinary(max) 列中存储的现有图像替换为新图像。 将 OPENROWSET 函数和 BULK 选项一起使用以将图像加载到列中。 此示例假定指定的文件路径中存在名为 Tires.jpg 的文件。USE AdventureWorks2012;GOUPDATE Production.ProductPhotoSET ThumbNailPhoto = ( SELECT * FROM OPENROWSET(BULK 'c:\Tires.jpg', SINGLE_BLOB) AS x )WHERE ProductPhotoID = 1;GO5、捕获 UPDATE 语句的结果USE AdventureWorks2012;GODECLARE @MyTableVar table( EmpID int NOT NULL, OldVacationHours int, NewVacationHours int, ModifiedDate datetime);UPDATE TOP (10) HumanResources.EmployeeSET VacationHours = VacationHours * 1.25, ModifiedDate = GETDATE() OUTPUT inserted.BusinessEntityID, deleted.VacationHours, inserted.VacationHours, inserted.ModifiedDateINTO @MyTableVar;
--Display the result set of the table variable.SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDateFROM @MyTableVar;GO
--Display the result set of the table.SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDateFROM HumanResources.Employee;GO
inserted、deleted都是触发器中常用到的系统表。inserted:当有新记录被INSERT,或原表中有记录被UPDATE,那么这些新记录会拷贝一份到inserted;deleted:当记录被update、delete,那么会从原表中拷贝一份到deleted表,然后原表中的记录被修改、删除;
6、UPDATE使用CASE语句UPDATE [Table1] SET [StatuID] = CASE WHEN [StatuID] - 1 < 0 THEN 0 ELSE [StatuID] - 1 END WHERE [IndexId] = @IndexId;7、在 TRY…CATCH 块中使用 UPDATE以下示例在 TRY…CATCH 块中使用 UPDATE 语句来处理在执行更新操作期间可能遇到的执行错误。USE AdventureWorks2012;GOBEGIN TRANSACTION;BEGIN TRY -- Intentionally generate a constraint violation error. UPDATE HumanResources.Department SET Name = N'MyNewName' WHERE DepartmentID BETWEEN 1 AND 2;END TRYBEGIN CATCH SELECT ERROR_NUMBER() AS ErrorNumber ,ERROR_SEVERITY() AS ErrorSeverity ,ERROR_STATE() AS ErrorState ,ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLine ,ERROR_MESSAGE() AS ErrorMessage; IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;END CATCH;IF @@TRANCOUNT > 0 COMMIT TRANSACTION;GO这种语句,主要是看看里面这些系统函数的用法。
8、使用 WHERE CURRENT OF 子句
以下示例使用 WHERE CURRENT OF 子句来只更新游标位于其上的行。 如果游标基于某个联接,则只修改 UPDATE 语句中指定的 table_name。 其他参与该游标的表不会受到影响。
USE AdventureWorks2012;GODECLARE 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.EmployeePayHistorySET PayFrequency = 2 WHERE CURRENT OF complex_cursor;CLOSE complex_cursor;DEALLOCATE complex_cursor;GO
按我的理解,游标相当于DataReader,逐行读取,并且保持数据库连接。针对游标中的行进行修改,会直接投射到数据库中,改游标其实就相当于改数据库。
UPDATE语句的写法还有很多,以上只是摘录一二而已。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~