天天看点

数据库分析实用脚本

--**************************************
-- 数据库分析实用脚本
--**************************************
--1 查询数据库ID                                                                                                       
select db_id('soft')
--插入默认GUID
ALTER TABLE [dbo].[DD_BandTotalProportion] ADD  CONSTRAINT [DF_DD_BandTotalProportion_Id]  DEFAULT (NEWID()) FOR [Id]

--2 查询 连接数据库的进程ID
select Hostname,spid,* from master.dbo.sysprocesses where dbid in (select dbid from master.dbo.sysdatabases where name='soft2')
and  Hostname like 'PC201710101756%'   
 
--3 查询数据库所有表记录
SELECT a.name, b.rows
FROM sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id
WHERE (a.type = 'u') AND (b.indid IN (0, 1))
ORDER BY b.rows DESC

--4 查询表数据字典完全版
SELECT      
  表名=case   when   a.colorder=1   then  d.name   else   ''  end,        
  字段序号=a.colorder,    
  字段名=a.name,    
  标识=case   when   COLUMNPROPERTY(   a.id,a.name,'IsIdentity')=1   then  '√'else   ''  end,    
  主键=case   when   exists(SELECT   1  FROM   sysobjects   where  xtype='PK'   and   name  in   (    
  SELECT  name   FROM   sysindexes  WHERE   indid   in(    
  SELECT  indid   FROM   sysindexkeys   WHERE  id   =   a.id  AND   colid=a.colid    
  )))   then  '√'  else   ''   end,    
  类型=b.name,    
  占用字节数=a.length,    
  长度=COLUMNPROPERTY(a.id,a.name,'PRECISION'),    
  小数位数=isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0),    
  允许空=case   when   a.isnullable=1   then  '√'else   ''  end,    
  默认值=isnull(e.text,''),    
  字段说明=isnull(ep.[value],'')    
  FROM  syscolumns   a    
  left  join   systypes   b   on   a.xtype=b.xusertype    
  inner  join   sysobjects   d   on   a.id=d.id    and   d.xtype='U'   and    d.name<>'dtproperties'    
  left  join   syscomments   e   on   a.cdefault=e.id   
  LEFT JOIN sys.extended_properties AS ep  ON ep.major_id = a.id and ep.class =1 and a.colorder=ep.minor_id
  where   d.name='aaClass'         --如果只查询指定表,加上此条件    
  order  by   a.id,a.colorder 

-- 5 查询数据字典简化版
SELECT 
t.[name] AS 表名,
c.[name] AS 字段名,
cast(ep.[value] as nvarchar(200)) AS [字段说明]  
FROM sys.tables AS t  
INNER JOIN sys.columns AS c ON t.object_id = c.object_id  
LEFT JOIN sys.extended_properties AS ep  ON ep.major_id = c.object_id 
AND ep.minor_id = c.column_id WHERE --ep.class =1   AND
t.name='aaClass'    

--6 查询数据库所有对象的定义 
--D:默认值,FN:xx函数,IF:xx函数,TF:xx函数 P:存储过程,TR:触发器 V :视图
select a.name,a.[type],b.[definition] 
from sys.all_objects a,sys.sql_modules b 
where a.is_ms_shipped=0 and a.object_id = b.object_id 
-- and a.[type] in ('P','V','AF','FN') --要查询的对象类型
-- and a.name='对象名'    --要查询的对象名称
order by a.[type] asc

--1. Name:对象名
--2. Object_id:对象标识号,在数据中是唯一的
--3. Principal_id :架构所有者ID
--4. Parent_object_id:此对象所属对象的ID,0 = 不是子对象
--5. Type:对象类型,常用的类型有, AF = 聚合函数 P = SQL 存储过程  V = 视图  TT = 表类型   U = 表(用户定义类型)
--6. Type_desc:对象类型的说明
--7. Create_date / Modify_date :创建日期 / 修改日期
--8. is_ms_shipped:是否为 内部 SQL Server 组建所创建的对象,常用来判断 是否是 系统内置或用户自定义 的对象

      
--数据库查询性能监控
DECLARE @t DATETIME
    SELECT @t=GETDATE()
    waitfor delay '00:00:01' --延迟1秒
    SELECT DATEDIFF(ms,@t,GETDATE())      
--判断存储过程是否存在
if exists(select 1 from sysobjects where id=object_id('PROC_GetQty_FromTBusRetail') and xtype='P')   
DROP PROCEDURE PROC_GetQty_FromTBusRetail      

 --如果是实表可以用

if exists (select * from sysobjects where id = object_id(N'[dbo].[表名]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 

drop table [dbo].[表名]

--如果是临时表可以用(说明,如果用查找实表方法来打临时表会找不到.发布区别对代.)

if object_id('tempdb..##temp') is not null

   drop table ##temp

数据库锁:帮助脚本

--锁表(其它事务不能读、更新、删除)
BEGIN TRAN
SELECT * FROM <表名> WITH(TABLOCKX);
WAITFOR delay '00:00:20'
COMMIT TRAN


--锁表(其它事务只能读,不能更新、删除)
BEGIN TRAN
SELECT * FROM <表名> WITH(HOLDLOCK);
WAITFOR delay '00:00:20'
COMMIT TRAN

--锁部分行
BEGIN TRAN
SELECT * FROM <表名>  WITH(XLOCK) WHERE ID IN ('81A2EDF9-D1FD-4037-A17B-1369FD3B169B');
WAITFOR delay '00:01:20'
COMMIT TRAN

--查看被锁表
select   request_session_id   锁表进程,OBJECT_NAME(resource_associated_entity_id) 被锁表名  
from   sys.dm_tran_locks where resource_type='OBJECT';

--解锁
declare @spid  int
Set @spid  = 55 --锁表进程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid  as varchar)
exec(@sql)      

转载于:https://www.cnblogs.com/zoumin123/p/7742492.html