码迷,mamicode.com
首页 > 数据库 > 详细

整理的一些数据库不容易想到的SQL语句实例一

时间:2015-04-01 12:42:02      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:

1、行转列SQL语句

SELECT  *
FROM    ( SELECT    [FID] ,
                    [Weeks] ,
                    [Qty]
          FROM      dbo.TempTable where Weeks is not null 
        ) p PIVOT
( SUM([Qty]) FOR [Weeks] IN ([1],[2],[3],[4],[5],[6])) AS pvt

2、游标

declare P_Product_Main CURSOR FAST_FORWARD FOR
SELECT PID FROM [表名] order by PID
-- 打开游标.
   OPEN P_Product_Main
   --填充数据.
   FETCH NEXT FROM P_Product_Main INTO @PID
   --假如检索到了数据,才处理.
   WHILE @@fetch_status = 0
   begin
   
   print @PID;
   
   end
   fetch next from P_Product_Main into @PID;
   end
   -- 关闭游标
   CLOSE P_Product_Main
   --释放游标.
   DEALLOCATE P_Product_Main

3、 查看当前进程,或死锁进程,并能自动杀掉死进程,因为是针对死的,所以如果有死锁进程,只能查看死锁进程,当然,你可以通过参数控制,不管有没有死锁,都只查看死锁进程

 

create proc [dbo].[sp_lock2]
@kill_lock_spid bit=1,  --是否杀掉死锁的进程,1 杀掉, 0 仅显示
@show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示
as
declare @count int,@s nvarchar(1000),@i int
select id=identity(int,1,1),标志,
 进程ID=spid,线程ID=kpid,块进程ID=blocked,数据库ID=dbid,
 数据库名=db_name(dbid),用户ID=uid,用户名=loginame,累计CPU时间=cpu,
 登陆时间=login_time,打开事务数=open_tran, 进程状态=status,
 工作站名=hostname,应用程序名=program_name,工作站进程ID=hostprocess,
 域名=nt_domain,网卡地址=net_address
into #t from(
 select 标志=‘死锁的进程‘,
  spid,kpid,a.blocked,dbid,uid,loginame,cpu,login_time,open_tran,
  status,hostname,program_name,hostprocess,nt_domain,net_address,
  s1=a.spid,s2=0
 from master..sysprocesses a join (
  select blocked from master..sysprocesses group by blocked
  )b on a.spid=b.blocked where a.blocked=0
 union all
 select ‘|_牺牲品_>‘,
  spid,kpid,blocked,dbid,uid,loginame,cpu,login_time,open_tran,
  status,hostname,program_name,hostprocess,nt_domain,net_address,
  s1=blocked,s2=1
 from master..sysprocesses a where blocked<>0
)a order by s1,s2
 
select @count=@@rowcount,@i=1
 
if @count=0 and @show_spid_if_nolock=1
begin
 insert #t
 select 标志=‘正常的进程‘,
  spid,kpid,blocked,dbid,db_name(dbid),uid,loginame,cpu,login_time,
  open_tran,status,hostname,program_name,hostprocess,nt_domain,net_address
 from master..sysprocesses
 set @count=@@rowcount
end
 
if @count>0
begin
 create table #t1(id int identity(1,1),a nvarchar(30),b Int,EventInfo nvarchar(255))
 if @kill_lock_spid=1
 begin
  declare @spid varchar(10),@标志 varchar(10)
  while @i<=@count
  begin
   select @spid=进程ID,@标志=标志 from #t where id=@i
   insert #t1 exec(‘dbcc inputbuffer(‘+@spid+‘)‘)
   if @标志=‘死锁的进程‘ exec(‘kill ‘+@spid)
   set @i=@i+1
  end
 end
 else
  while @i<=@count
  begin
   select @s=‘dbcc inputbuffer(‘+cast(进程ID as varchar)+‘)‘ from #t where id=@i
   insert #t1 exec(@s)
   set @i=@i+1
  end
 select a.*,进程的SQL语句=b.EventInfo
 from #t a join #t1 b on a.id=b.id
end
create Procedure [dbo].[sp_who_lock]
as
begin
declare @spid int,@bl int,
	@intTransactionCountOnEntry 	int,
        @intRowcount 			int,
        @intCountProperties 		int,
        @intCounter 			int
	set nocount on
	create table #tmp_lock_who (
	id int identity(1,1),
	spid smallint,
	bl smallint)
	
	IF @@ERROR<>0 RETURN @@ERROR
	
	insert into #tmp_lock_who(spid,bl) select  0 ,blocked
	  from (select * from master.dbo.sysprocesses where  blocked>0 ) a 
	  where not exists(select * from (select * from master.dbo.sysprocesses where  blocked>0 ) b 
	  where a.blocked=spid)
	  union select spid,blocked from master.dbo.sysprocesses where  blocked>0
 
	IF @@ERROR<>0 RETURN @@ERROR	
	 
-- 找到临时表的记录数
	select 	@intCountProperties = Count(*),@intCounter = 1
	from #tmp_lock_who
	
	IF @@ERROR<>0 RETURN @@ERROR	
	
	if	@intCountProperties=0
		select ‘现在没有阻塞和死锁信息‘ as message
 
-- 循环开始
while @intCounter <= @intCountProperties
begin
-- 取第一条记录
		select 	@spid = spid,@bl = bl
		from #tmp_lock_who where Id = @intCounter 
	begin
	 if @spid =0 
            select ‘引起数据库死锁的是: ‘+ CAST(@bl AS VARCHAR(10)) + ‘进程号,其执行的SQL语法如下‘
 else
            select ‘进程号SPID:‘+ CAST(@spid AS VARCHAR(10))+ ‘被‘ + ‘进程号SPID:‘+ CAST(@bl AS VARCHAR(10)) +‘阻塞,其当前进程执行的SQL语法如下‘
 DBCC INPUTBUFFER (@bl )
	end	
 
-- 循环指针下移
	set @intCounter = @intCounter + 1
end
 
 
drop table #tmp_lock_who
	set nocount off
return 0
end

4、 临时表

select top(100) *
	into #temp_table
	from WOTable  as a
	where StartTime=@startdate and not exists (select ID from temp_WOCode where ID=a.ID and Status=0) 
	and [Status]=0 and CurrentStatus<>999

	update a set a.BurdeningStatus=20,a.BurdeningDateTime=GETDATE(),a.BurdeningPerson=@userid  
	from   WOTable    as a  where exists (
		select ID from  #temp_table where ID=a.ID and Status=0
	)

5、事务

begin tran  --开始事务
BEGIN TRY
        
	if @@trancount <>0
	begin
		print ‘has data, commit tran‘
		commit tran
	end
END TRY
BEGIN CATCH
	if @@trancount <>0
	begin
		rollback tran
	end
END CATCH

6、索引

//普通索引
CREATE INDEX <索引的名字> ON tablename (列名);
//唯一索引
CREATE UNIQUE INDEX <索引的名字> ON tablename (列名);
drop index <索引的名字>

 

整理的一些数据库不容易想到的SQL语句实例一

标签:

原文地址:http://www.cnblogs.com/jin7yan/p/4383250.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!