学习笔记—— 一些UPDATE语句

网友投稿 723 2022-12-02

学习笔记—— 一些UPDATE语句

学习笔记—— 一些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小时内删除侵权内容。

上一篇:解决线程池中ThreadGroup的坑
下一篇:学习笔记——AOP
相关文章

 发表评论

暂时没有评论,来抢沙发吧~