数据库干货:整理SQL Server非常实用的脚本

数据库 SQL Server
今天给大家分享自己在工作当中用到的SQLServer一些常用的脚本,希望能对大家有所帮助!

[[358579]]

今天给大家分享自己在工作当中用到的SQLServer一些常用的脚本,希望能对大家有所帮助!

1、 查询数据库所有表结构

通过该脚本可以快速查找表字段,或者生成数据库设计文档、进行数据库对比。

 

SELECT obj.name 表名, 
col.colorder AS 序号 , 
col.name AS 列名 , 
ISNULL(ep.[value], ''AS 列说明 , 
t.name AS 数据类型 , 
CASE WHEN col.isnullable = 1 THEN '1' 
ELSE '' 
END AS 允许空 , 
ISNULL(comm.text, ''AS 默认值, 
Coalesce(epTwo.value, ''AS documentation 
FROM dbo.syscolumns col 
LEFT JOIN dbo.systypes t ON col.xtype = t.xusertype 
inner JOIN dbo.sysobjects obj ON col.id = obj.id 
AND obj.xtype = 'U' 
AND obj.status >= 0 
LEFT JOIN dbo.syscomments comm ON col.cdefault = comm.id 
LEFT JOIN sys.extended_properties ep ON col.id = ep.major_id 
AND col.colid = ep.minor_id 
AND ep.name = 'MS_Description' 
LEFT JOIN sys.extended_properties epTwo ON obj.id = epTwo.major_id 
AND epTwo.minor_id = 0 
AND epTwo.name = 'MS_Description' 
WHERE obj.name in
SELECT 
ob.name  
FROM sys.objects AS ob 
LEFT OUTER JOIN sys.extended_properties AS ep 
ON ep.major_id = ob.object_id 
AND ep.class = 1 
AND ep.minor_id = 0 
WHERE ObjectProperty(ob.object_id, 'IsUserTable') = 1  

ORDER BY obj.name ; 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.

2、SQLServer 查询数据库各个数据表、索引文件占用的存储空间

可以快速查询数据库中表、索引占用的存储空间,找到哪些表占用了大量的存储空间,便于进行数据库优化。

 

CREATE PROCEDURE [dbo].[sys_viewTableSpace] 
AS  
 
BEGIN  
 
SET NOCOUNT ON 
 
CREATE TABLE [dbo].#tableinfo( 
 表名 [varchar](50) COLLATE Chinese_PRC_CI_AS NULL
 记录数 [intNULL
 预留空间 [varchar](50) COLLATE Chinese_PRC_CI_AS NULL
 使用空间 [varchar](50) COLLATE Chinese_PRC_CI_AS NULL
 索引占用空间 [varchar](50) COLLATE Chinese_PRC_CI_AS NULL
 未用空间 [varchar](50) COLLATE Chinese_PRC_CI_AS NULL 
 
 
insert into #tableinfo(表名, 记录数, 预留空间, 使用空间, 索引占用空间, 未用空间) 
exec sp_MSforeachtable "exec sp_spaceused '?'"  
 
select * from #tableinfo 
order by 记录数 desc  
 
drop table #tableinfo  
 
END 
-- 执行方法 
exec sys_viewtablespace 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

3、清理数据库日志文件

数据库日志文件一般都会非常大,甚至占用超过几百G甚至上T,如果不需要进行一直保留数据库日志文件,可以建一个数据库作业,定时清理数据库日志文件,具体可以采用下面的脚本。

 

USE master  
ALTER DATABASE DB SET RECOVERY SIMPLE WITH NO_WAIT  
ALTER DATABASE DB SET RECOVERY SIMPLE --调整为简单模式  
USE DB  
DBCC SHRINKFILE (N'DB_log' , 2, TRUNCATEONLY) --设置压缩后的日志大小为2M,可以自行指定  
USE master  
ALTER DATABASE DB SET RECOVERY FULL WITH NO_WAIT  
ALTER DATABASE DB SET RECOVERY FULL --还原为完全模式 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

4、SQLServer查看锁表和解锁

工作中遇到查询的时候一直查询不出来结果,可以执行该脚本判断是否锁表,然后解锁就可以正常查询数据了。

 

-- 查询被锁表 
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName    
from   sys.dm_tran_locks where resource_type='OBJECT'
--参数说明 spid   锁表进程 ;tableName   被锁表名 
-- 解锁语句 需要拿到spid然后杀掉缩表进程 
declare @spid  int  
Set @spid  = 57 --锁表进程 
declare @sql varchar(1000) 
set @sql='kill '+cast(@spid  as varchar
exec(@sql) 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

5、SQLServer生成日期维度表

该脚本可以生成一个日期维度的数据表,通过该数据表可以解决很多报表查询问题。非常实用。

 

--1、创建数据表 T_Date 
CREATE TABLE [dbo].[T_Date]( 
[the_date] [intNOT NULL
[date_name] [nvarchar](30) NULL
[the_year] [intNULL
[year_name] [nvarchar](30) NULL
[the_quarter] [intNULL
[quarter_name] [nvarchar](30) NULL
[the_month] [intNULL
[month_name] [nvarchar](30) NULL
[the_week] [intNULL
[week_name] [nvarchar](30) NULL
[week_day] [intNULL
[week_day_name] [nvarchar](30) NULL
CONSTRAINT [PK_T_Date] PRIMARY KEY CLUSTERED  

[the_date] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,  
       IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)  
ON [PRIMARY
ON [PRIMARY
GO 
 
 
-- 2、创建生成日期的存储过程 
GO 
/****** Object: StoredProcedure [dbo].[SP_CREATE_TIME_DIMENSION]  ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
 
 
CREATE PROCEDURE [dbo].[SP_CREATE_TIME_DIMENSION] 
@begin_date nvarchar(50)='2015-01-01' , 
@end_date nvarchar(50)='2030-12-31' 
as 
/* 
SP_CREATE_TIME_DIMENSION: 生成时间维数据 
begin_date: 开始时间 
end_date:结束时间 
*/ 
declare  
@dDate date=convert(date,@begin_date), 
@v_the_date varchar(10), 
@v_the_year varchar(4), 
@v_the_quarter varchar(2), 
@v_the_month varchar(10), 
@v_the_month2 varchar(2), 
@v_the_week varchar(2), 
@v_the_day varchar(10), 
@v_the_day2 varchar(2), 
@v_week_day nvarchar(10), 
@adddays int=1; 
WHILE (@dDate<=convert(date,@end_date)) 
begin 
set @v_the_date=convert(char(10),@dDate,112);--key值格式为yyyyMMdd 
set @v_the_year=DATEPART("YYYY",@dDate);--年份 
set @v_the_quarter=DATEPART("QQ",@dDate);--季度 
set @v_the_month=DATEPART("MM",@dDate);--月份(字符型) 
set @v_the_day=DATEPART("dd",@dDate);--日(字符型) 
set @v_the_week=DATEPART("WW",@dDate);--年的第几周 
set @v_week_day=DATEPART("DW",@dDate); --星期几 
-- 插入数据 
insert into T_Date(the_date,date_name,the_year,year_name,the_quarter, 
 quarter_name,the_month,month_name,the_week,week_name,week_day,week_day_name) 
values
@v_the_date, 
convert(nvarchar(10),@v_the_year)+'年'+convert(nvarchar(10),@v_the_month) 
  +'月'+convert(nvarchar(10),@v_the_day)+'日'
@v_the_year, 
convert(nvarchar(10),@v_the_year)+'年'
@v_the_quarter, 
convert(nvarchar(10),@v_the_year)+'年'+convert(nvarchar(10),@v_the_quarter)+'季度'
case when @v_the_month>=10 then  
convert(int,(convert(nvarchar(10),@v_the_year)+convert(nvarchar(10),@v_the_month))) 
else convert(int,convert(nvarchar(10),@v_the_year)+'0' 
             +convert(nvarchar(10),@v_the_month)) end
convert(nvarchar(10),@v_the_year)+'年'+convert(nvarchar(10),@v_the_month)+'月'
@v_the_week 
,'第'+convert(nvarchar(10),@v_the_week)+'周'
@v_week_day, 
case @v_week_day-1  
when 1 then '星期一'  
when 2 then '星期二'  
when 3 then '星期三' 
when 4 then '星期四'  
when 5 then '星期五'  
when 6 then '星期六' 
when 0 then '星期日' 
else '' end 
); 
set @dDate=dateadd(day,@adddays,@dDate); 
continue 
if @dDate=dateadd(day,-1,convert(date,@end_date)) 
break 
end 
 
 
-- 3、执行存储过程生成数据 
GO 
DECLARE @return_value int 
EXEC    @return_value = [dbo].[SP_CREATE_TIME_DIMENSION] 
SELECT    'Return Value' = @return_value 
GO 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.

 

责任编辑:未丽燕 来源: 今日头条
相关推荐

2021-01-08 16:27:52

SQL数据库开发

2010-07-01 11:49:13

SQL Server

2010-07-15 17:28:50

SQL Server

2010-07-08 11:05:14

SQL Server数

2011-03-18 13:23:47

SQL ServerOracle

2020-08-21 10:25:02

PythonWget

2020-09-14 11:10:43

Python代码

2011-03-24 09:45:34

SQL Server数恢复

2011-03-24 09:07:11

SQL Server数备份

2011-03-24 09:24:08

SQL Server数还原

2018-12-12 19:10:01

Oracle数据库自动备份

2021-05-17 06:57:34

SQLServer数据库

2021-03-28 10:16:18

SQL Server数据库PowerDesign

2010-09-14 09:53:52

sql server还

2010-10-22 15:42:59

SQL Server创

2010-07-12 09:10:05

SQL Server数

2011-04-07 14:50:21

SQL Server数据库

2011-04-01 17:05:44

SQL Server数日志

2010-06-30 11:16:50

SQL Server

2011-04-29 14:30:23

点赞
收藏

51CTO技术栈公众号