飞道的博客

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

525人阅读  评论(0)

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

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

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


   
  1. SELECT obj.name 表名,
  2. col.colorder AS 序号 ,
  3. col.name AS 列名 ,
  4. ISNULL(ep.[ value], '') AS 列说明 ,
  5. t.name AS 数据类型 ,
  6. CASE WHEN col.isnullable = 1 THEN '1'
  7. ELSE ''
  8. END AS 允许空 ,
  9. ISNULL(comm.text, '') AS 默认值,
  10. Coalesce(epTwo.value, '') AS documentation
  11. FROM dbo.syscolumns col
  12. LEFT JOIN dbo.systypes t ON col.xtype = t.xusertype
  13. inner JOIN dbo.sysobjects obj ON col.id = obj.id
  14. AND obj.xtype = 'U'
  15. AND obj.status >= 0
  16. LEFT JOIN dbo.syscomments comm ON col.cdefault = comm.id
  17. LEFT JOIN sys.extended_properties ep ON col.id = ep.major_id
  18. AND col.colid = ep.minor_id
  19. AND ep.name = 'MS_Description'
  20. LEFT JOIN sys.extended_properties epTwo ON obj.id = epTwo.major_id
  21. AND epTwo.minor_id = 0
  22. AND epTwo.name = 'MS_Description'
  23. WHERE obj.name in(
  24. SELECT
  25. ob.name
  26. FROM sys.objects AS ob
  27. LEFT OUTER JOIN sys.extended_properties AS ep
  28. ON ep.major_id = ob.object_id
  29. AND ep.class = 1
  30. AND ep.minor_id = 0
  31. WHERE ObjectProperty(ob.object_id, 'IsUserTable') = 1
  32. )
  33. ORDER BY obj.name ;

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

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


   
  1. CREATE PROCEDURE [dbo].[sys _viewTableSpace]
  2. AS
  3. BEGIN
  4. SET NOCOUNT ON;
  5. CREATE TABLE [dbo].#tableinfo(
  6. 表名 [varchar](50) COLLATE Chinese_PRC _CI_AS NULL,
  7. 记录数 [int] NULL,
  8. 预留空间 [ varchar]( 50) COLLATE Chinese _PRC_CI _AS NULL,
  9. 使用空间 [varchar](50) COLLATE Chinese_PRC _CI_AS NULL,
  10. 索引占用空间 [ varchar]( 50) COLLATE Chinese _PRC_CI _AS NULL,
  11. 未用空间 [varchar](50) COLLATE Chinese_PRC _CI_AS NULL
  12. )
  13. insert into #tableinfo(表名, 记录数, 预留空间, 使用空间, 索引占用空间, 未用空间)
  14. exec sp _MSforeachtable "exec sp_spaceused '?'"
  15. select * from #tableinfo
  16. order by 记录数 desc
  17. drop table #tableinfo
  18. END
  19. -- 执行方法
  20. exec sys_viewtablespace

3、清理数据库日志文件

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


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

4、SQLServer查看锁表和解锁

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


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

5、SQLServer生成日期维度表

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


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

IT技术分享社区

个人博客网站:https://programmerblog.xyz

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识


转载:https://blog.csdn.net/xishining/article/details/111188838
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场