存储过程 + 事务
ALTER Procedure dbo.proc_Pets_MatingRequest_Update (@MRId int,@RequestStatus int ,@PetStatus int) AS Begin SET NOCOUNT ON; SET XACT_ABORT ON; BEGIN TRY BEGIN TRAN DECLARE @count int =0 UPDATE dbo.Pets SET PetStatus = @PetStatus WHERE PetId= (SELECT PetId FROM dbo.MatingRequests WHERE MRId = @MRId) SET @count += @@ROWCOUNT UPDATE dbo.MatingRequests SET RequestStatus = @RequestStatus WHERE MRId = @mrid SET @count += @@ROWCOUNT IF(@count = 2) COMMIT TRAN ELSE ROLLBACK TRAN SELECT @count END TRY BEGIN CATCH IF XACT_STATE()=-1 ROLLBACK TRAN END CATCH SET NOCOUNT OFF End
行列转换
参考:http://www.cnblogs.com/zhangzt/archive/2010/07/29/1787825.html
PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现
PIVOT的一般语法是:PIVOT( 聚合函数(列) FOR 列 IN (…) )AS P
完整语法:
table_source
PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) )
UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2000可以用UNION来实现
完整语法:
table_source
UNPIVOT( value_column FOR pivot_column IN(<column_list>) )
各列类型需要一致。
注意:PIVOT、UNPIVOT是SQL Server 2005的语法,使用需修改数据库兼容级别,在数据库属性->选项->兼容级别改为90。
PS:pivot-以…为中心旋转
实例:
SELECT PetId,Field,Url FROM ( SELECT PetId,[ImageUrl1],[ThumbnailUrl40],[ThumbnailUrl60],[ThumbnailUrl100],[ThumbnailUrl160],[ThumbnailUrl180],[ThumbnailUrl220],[ThumbnailUrl310],[ThumbnailUrl410],[ImageUrl2],[ImageUrl3],[ImageUrl4],[ImageUrl5],[HeadImage] FROM Pets WHERE PetId = 5011 ) T UNPIVOT( Url FOR Field IN ([ImageUrl1],[ThumbnailUrl40],[ThumbnailUrl60],[ThumbnailUrl100],[ThumbnailUrl160],[ThumbnailUrl180],[ThumbnailUrl220],[ThumbnailUrl310],[ThumbnailUrl410],[ImageUrl2],[ImageUrl3],[ImageUrl4],[ImageUrl5],[HeadImage]) ) P