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

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 @[email protected]@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 @[email protected]@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<[email protected]
  begin
   select @spid=进程ID,@标志=标志 from #t where [email protected]
   insert #t1 exec(‘dbcc inputbuffer(‘[email protected]+‘)‘)
   if @标志=‘死锁的进程‘ exec(‘kill ‘[email protected])
   set @[email protected]+1
  end
 end
 else
  while @i<[email protected]
  begin
   select @s=‘dbcc inputbuffer(‘+cast(进程ID as varchar)+‘)‘ from #t where [email protected]
   insert #t1 exec(@s)
   set @[email protected]+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 [email protected] 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(),[email protected]
	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 <索引的名字>
时间: 2024-10-08 20:24:36

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

创建数据库和表相关的SQL语句

SQL server注释语句有两种: 一种是单行注释,一种是多行注释. ******************** 单行注释用:--注释一行内容 多行注释用:/* *注释 *多行内容 */ 创建数据库: 语句如下: /*创建数据库主文件 create database student:新建数据库逻辑名称为student filename='d:\stduent_data.mdf':数据库文件保存路径和名字. on primary:primary—默认文件组,表示表是建立在主文件组上,可以省略. s

数据库添加数据II及SQL语句错误

前些时候,写的代码(数据库添加数据I),往数据库添加数据都是很基本的一条一条地添加.但是平常用于测试时,总不可能一条一条地添加测试数据吧,然后我就尝试着一次性添加几百上千条,但是再次操作的时候,就出问题了.因为平常看书的时候,都只是一瞥而过,而且书上写的基本都是函数原型,函数原型相当‘简单’!但是用的时候就容易出错了,所以特意写一篇如何往数据库添加数据. 首先在test数据库中建一个users表,users(UserID,UserName,UserStatus),下划线表示主键,然后开始进行操作

MSSQL数据库导入导出大全二(SQL语句)

Excel文件导入数据库多个Sheet if exists(select 1 from sysobjects where name=N'p_import_excel' and type='P')drop proc p_import_excelgo--调用示例exec p_import_excel 'c:\123.xls','Sheet1;Sheet2;Sheet3','tbl'create proc p_import_excel@excfilename nvarchar(100),--文件路径@

python 操作数据库1--连接、执行sql语句

#!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2017/11/20 16:03 # @Author : lijunjiang # @File : demo.py import MySQLdb # 连接数据库 # host 数据库IP # port 数据库监听端口 # user 数据库用户 # passwd 用户密码 # db 数据库名 # charset 字符集 默认uft-8 # MySQLdb.Connect 方法 #comn=

提高数据库的查询速率及其sql语句的优化问题

在一个千万级的数据库查寻中,如何提高查询效率? 1)数据库设计方面:  a.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. b.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0

删除数据库的视图方法和sql语句进行删除

一.视图方法 点击数据库--右键--点击删除 二.sql语句删除方法 (1)  USE master    --向这个数据库 DROP DATABASE E_Market     --删除E_Market数据库 GO (2)判断数据是否有 E_Market 这个数据库.如果有就进行删除 --判断数据是否有 E_Market 这个数据库.如果有就进行删除IF EXISTS(select * from sysdatabases WHERE name='E_Market')      注意:括号里面是

面试题 | 数据库笔试题集合&#183;之&#183;SQL语句(2)

第2章 SQL 语句 2.1 选择2.1.1 DELETE FROM S WHERE 年龄>60 语句的功能是( A ) A.从 S 表中彻底删除年龄大于 60 岁的记录B.S 表中年龄大于 60 岁的记录被加上删除标记C.删除 S 表D.删除 S 表的年龄列 2.1.2 使用什么命令可以清除表中所有的内容? ( CD ) A.INSERT  B.UPDATE C.DELETE D.TRUNCATE 2.1.3 以下哪个表不用于 mysql 的权限管理( D ) A.HOST         

数据库学习之简单的SQL语句

1.数据库的结构 1.1数据库 不同数据库叫做Catalog(在有的 DBMS 中也称为 Database,即数据库) .採用多 Catalog 以后能够给我们带 来例如以下优点: 便于对各个 Catalog 进行个性化管理. DBMS 都同意我们指定将不同的 Catalog 保存在不 同的磁盘上, 因为人力资源数据相对次要一些, 因此我们能够将 HR 保存在普通硬盘上. 而将 BIZ 保存在 RAID 硬盘上. 我们还能够对每一个 Catalog 所能占领的最大磁盘空间.日 志大小甚至优先级进

异构数据库之间完全可以用SQL语句导数据

告诉你一个最快的方法,用SQLServer连接DBF 在SQLServer中执行 SELECT * into bmk FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',  'Data Source="e:\share";User ID=Admin;Password=;Extended properties=dBase 5.0')...bmk 这样就可以把e:\share中的bmk.dbf表导入到Sqlserver中, 速度是最快的 把压箱底的