SQL Notes

存储过程 + 事务

  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

  

 

 

 

 

posted on 2017-08-21 09:48  呼呼net  阅读(241)  评论(0编辑  收藏  举报

导航