sql server的sql语句(SQLServer常用SQL语句)

1. sqlserver查看实例级别的信息,使用SERVERPROPERTY函数

select SERVERPROPERTY ('propertyname')

2. 查看实例级别的某个参数XX的配置

select * from sys.configurations where name='XX'

3. 更改实例级别的某个参数XX的值

sp_configure 'XX','0' RECONFIGURE WITH OVERRIDE

sp_configure显示或更改当前服务器的全局配置设置。

RECONFIGURE表示sql server不用重新启动就立即生效 。

使用sp_configure更改设置时,请使用RECONFIGURE语句使更改立即生效,否则更改将在SQL Server重新启动后生效。RECONFIGURE后面加WITH OVERRIDE表示不管这个值是不是符合要求都会生效,比如recovery interval的范围值是10--60对应sys.configurations.minimum是10、sys.configurations.maximum是60,如果sp_configure 'recovery interval', 75设置为75,超过了这个10--60规范,但是要让75生效,则必须加上WITH OVERRIDE。

4. sqlserver没有系统表可以查询所有数据库下面对象,以下只能在当前数据库下面查

select * from sys.all_objects --查询当前数据库的所有架构范围的对象 select * from sys.sysobjects --查询当前数据库的所有对象 --sys.all_objects、sys.sysobjects 这种的视图,在每个数据库的系统视图下面都有 select * from sys.databases --在当前数据库下可以查询到所有数据库信息,包含是否on状态 select * from sys.sysdatabases --在当前数据库下可以查询到所有数据库信息,不包含是否on状态,这个系统视图会在后续的版本中删除 --sys.databases、sys.sysdatabases这种的视图,在每个数据库的系统视图下面都有 sys.processes --没有这个视图 select * from sys.sysprocesses --在当前数据库下可以查询所有正在SQL Server 实例上运行的进程的相关信息,也就是所有数据库上的线程,这个系统视图会在后续的版本中删除

5. 全局系统视图、单个数据库系统视图

sys.database_files --每个存储在数据库本身中的数据库文件在表中占用一行。这是一个基于每个数据库的视图。 sys.master_files --master 数据库中的每个文件对应一行。这是一个系统范围视图。 --sys.database_files、sys.master_files这种的视图,在每个数据库的系统视图下面都有

6. 一些只存在msdb的系统表,而非系统视图

dbo.backupset dbo.log_shipping_secondary dbo.restorehistory dbo.sysjobs dbo.sysjobhistory --这些系统表只存在msdb数据库,使用的时候必须加上msdb前缀

7. sp_lock、sp_who、sp_who2、sp_helptext等一些系统存储过程存在于每个数据库中

8. 报告有关锁的信息,会显示实例里面的所有数据库的锁信息、堵塞信息

sp_lock

9. 提供有关当前用户、 会话和进程的实例中的信息,可以看到会话的状态running、SUSPENDED、sleeping、rollback,sp_who2通过CPUTime、DiskIO可以判断对应的transaction是否很大

sp_who sp_who2 sp_who2 active (可选参数LoginName, 或active代表活动会话数) CPUTime (进程占用的总CPU时间) DiskIO (进程对磁盘读的总次数) LastBatch (客户最后一次调用存储过程或者执行查询的时间) ProgramName (用来初始化连接的应用程序名称,或者主机名)

10. 查看某个存储过程的内容

sp_helptext pro_name

11.显示某个线程号发送到sqlserver数据库的最后一个语句

DBCC INPUTBUFFER

12.假设查询到249被锁给堵塞了,查询被堵塞的SQL语句

DBCC INPUTBUFFER (249)

13. 查看某个数据库中是否存在活动事务,有活动事务就一定会写日志

DBCC OPENTRAN (dbname)

14. 监视日志空间

DBCC SQLPERF (LOGSPACE)

15. 查找无法重用日志中的空间的原因(日志无法截断导致日志文件越来越大,但是可用空间很小,无法收缩)

select name,log_reuse_wait_desc from sys.databases

16. 查看虚拟日志文件信息

DBCC LOGINFO

结果有多少行,代表有多少虚拟日志文件,活动的虚拟日志文件的状态(status)为2

17. 修复msdb数据库,比如ssms页面sql server agent丢失或看不了job view history等功能,说明msdb坏了,需要修复

dbcc checkdb (msdb);

18. 在您当前连接到的 SQL Server 数据库中生成一个手动检查点

CHECKPOINT [ checkpoint_duration ] --checkpoint_duration表示以秒为单位指定手动检查点完成所需的时间,一般不使用这个参数,让数据库自己控制

19. 查看数据库各种设置

select name,State,user_access,is_read_only,recovery_model from sys.databases

20. 查看某个数据库中是否存在会话

select DB_NAME(dbid),* from sys.sysprocesses where dbid=db_id('dbname')

21. 查询当前阻塞的所有请求

select * from sys.sysprocesses where blocked>0 或 SELECT t1.resource_type,db_name(t1.resource_database_id),t1.resource_associated_entity_id,t1.request_mode, t1.request_session_id,t2.blocking_session_id,t2.wait_duration_ms FROM sys.dm_tran_locks as t1 INNER JOIN sys.dm_os_waiting_tasks as t2 ON t1.lock_owner_address = t2.resource_address; 或 select A.SPID as 被阻塞进程,a.CMD AS 正在执行的操作,b.spid AS 阻塞进程号,b.cmd AS 阻塞进程正在执行的操作 from master..sysprocesses a,master..sysprocesses b where a.blocked<>0 and a.blocked= b.spid 或 SELECT session_Id,spid,ecid,DB_NAME (sp.dbid),nt_username,er.status,wait_type, [Individual Query] =SUBSTRING (qt.text,er.statement_start_offset / 2, ( CASE WHEN er.statement_end_offset = -1 THEN LEN (CONVERT (NVARCHAR (MAX), qt.text)) * 2 ELSE er.statement_end_offset END - er.statement_start_offset) / 2), qt.text,program_name,Hostname,nt_domain,start_time FROM sys.dm_exec_requests er INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid CROSS APPLY sys.dm_exec_sql_text (er.sql_handle) AS qt WHERE session_Id > 50 /* Ignore system spids.*/ AND sp.blocked>0 AND session_Id NOT IN (@@SPID) 或 SELECT session_id ,status ,blocking_session_id ,wait_type ,wait_time ,wait_resource ,transaction_id FROM sys.dm_exec_requests WHERE status = N'suspended'; --sys.dm_exec_requests返回SQL Server 中正在执行的每个请求的信息

22. 查看哪些表被锁了,以及这些表被哪个进程锁了

select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT' ORDER BY request_session_id ASC

23. 查询某个job是否被堵塞

select * from msdb.dbo.sysjobs where name='jobname' select a.program_name,a.* from master..sysprocesses a where a.program_name like ' 1CE57E8AC5%' --把第一个语句查询到的job_id代入第二个语句的program_name

24. 检查SQL Agent是否开启

IF EXISTS ( SELECT TOP 1 1 FROM sys.sysprocesses WHERE program_name = 'SQLAgent - Generic Refresher' ) SELECT 'Running' ELSE SELECT 'Not Running'

25. 查看活动线程执行的sql语句,并生成批量杀掉的语句

select 'KILL ' CAST(a.spid AS NVARCHAR(100)) AS KillCmd,REPLACE(hostname,' ','') as hostname ,replace(program_name,' ','') as program_name ,REPLACE(loginame, ' ', '') AS loginame, db_name(a.dbid) AS DBname,spid,blocked,waittime/1000 as waittime ,a.status,Replace(b.text,'''','''') as sqlmessage,cpu from sys.sysprocesses as a with(nolock) cross apply sys.dm_exec_sql_text(sql_handle) as b where a.status<>'sleeping' AND a.spid<>@@SPID

26. 查看备份进度

SELECT DB_NAME(database_id) AS Exec_DB ,percent_complete ,CASE WHEN estimated_completion_time < 36000000 THEN '0' ELSE '' END RTRIM(estimated_completion_time/1000/3600) ':' RIGHT('0' RTRIM((estimated_completion_time/1000)600/60), 2) ':' RIGHT('0' RTRIM((estimated_completion_time/1000)`), 2) AS [Time Remaining] ,b.text as tsql ,* FROM SYS.DM_EXEC_REQUESTS cross apply sys.dm_exec_sql_text(sql_handle) as b WHERE command LIKE 'Backup%' --and database_id=db_id('cardorder') --OR command LIKE 'RESTORE%' ORDER BY 2 DESC

27. 查看恢复进度

SELECT DB_NAME(database_id) AS Exec_DB ,percent_complete ,CASE WHEN estimated_completion_time < 36000000 THEN '0' ELSE '' END RTRIM(estimated_completion_time/1000/3600) ':' RIGHT('0' RTRIM((estimated_completion_time/1000)600/60), 2) ':' RIGHT('0' RTRIM((estimated_completion_time/1000)`), 2) AS [Time Remaining] ,b.text as tsql ,* FROM SYS.DM_EXEC_REQUESTS cross apply sys.dm_exec_sql_text(sql_handle) as b WHERE command LIKE 'RESTORE%' --and database_id=db_id('cardorder') --OR command LIKE 'RESTORE%' ORDER BY 2 DESC

28. 查看数据库的最近备份信息

SELECT database_name,type,MAX(backup_finish_date) AS backup_finish_date FROM msdb.dbo.backupset GROUP BY database_name,type ORDER BY database_name,type 备注:D 表示全备份,i 表示差异备份,L 表示日志备份

29. 查看数据库的历史备份记录,并生成restore语句

SELECT CONVERT(CHAR(100),SERVERPROPERTY('Servername'))AS Server, bs.database_name, bs.backup_start_date, bs.backup_finish_date, bs.expiration_date, CASE bs.type WHEN 'D' THEN 'Database' WHEN 'L' THEN 'Log' END AS backup_type, bs.backup_size, bmf.logical_device_name, bmf.physical_device_name, bs.name AS backupset_name, bs.description, 'RESTORE DATABASE [' bs.database_name '] FROM DISK=N''' bmf.physical_device_name '''WITH NORECOVERY;' FROM msdb.dbo.backupmediafamily bmf INNER JOIN msdb.dbo.backupset bs ON bmf.media_set_id=bs.media_set_id WHERE bs.backup_start_date>DATEADD(DAY,-1,GETDATE()) ORDER BY bs.backup_finish_date

30. 查询XX库从YYYY-MM-DD日期开始的日志备份记录,并生成restore log的语句

SELECT TOP 1000 S.database_name [Database], CASE [S].[type] WHEN 'L' THEN N'RESTORE LOG ' QUOTENAME(S.database_name) N' FROM DISK = ''' F.physical_device_name N''' WITH NORECOVERY;' END [LogRestore], F.physical_device_name, S.[Type], S.backup_start_date, S.backup_finish_date FROM msdb.dbo.backupmediafamily F INNER JOIN msdb.dbo.backupset S ON S.media_set_id = F.media_set_id WHERE S.database_name = 'XX' AND S.type = 'L' AND S.backup_start_date > 'YYYY-MM-DD' ORDER BY S.backup_start_date ASC

31. 查询always on状态是否正常

select dc.database_name, d.synchronization_health_desc, d.synchronization_state_desc, d.database_state_desc from sys.dm_hadr_database_replica_states d join sys.availability_databases_cluster dc on d.group_database_id=dc.group_database_id and d.is_local=1

32. 查看mirror镜像信息

SELECT db_name(database_id), mirroring_state_desc, mirroring_role_desc, mirroring_partner_name, mirroring_partner_instance FROM sys.database_mirroring 33. 查询SSRS Report Subscriptions相关的job SELECT b.name AS JobName , e.name , e.path , d.description , a.SubscriptionID , laststatus , eventtype , LastRunTime , date_created , date_modified FROM ReportServer.dbo.ReportSchedule a JOIN msdb.dbo.sysjobs b ON CONVERT(SYSNAME,a.ScheduleID) = b.name JOIN ReportServer.dbo.ReportSchedule c ON b.name = CONVERT(SYSNAME,c.ScheduleID) JOIN ReportServer.dbo.Subscriptions d ON c.SubscriptionID = d.SubscriptionID JOIN ReportServer.dbo.Catalog e ON d.report_oid = e.itemid WHERE e.name = 'Report Name Goes Here'

34. 查看某个数据库的数据文件信息,就算是mirror从库的数据文件也可以查到,filestream目录也可以查到

SELECT db_name(database_id),* FROM master.sys.master_files WHERE database_id =DB_ID(N'DBA');

35. 查看某个数据文件信息

select b.name,a.type_desc,a.name,a.physical_name,a.size,a.max_size,a.is_percent_growth,a.growth from sys.master_files a join sys.databases b on a.database_id=b.database_id and a.physical_name like '%DTSWonda_1%'

36. 查询实例的数据文件总大小

SELECT sum(size*8/1024/1024) FROM master.sys.master_files

37. 查询某个目录中数据库使用的总大小

SELECT a.size*8/1024/1024 ,a.* FROM master.sys.master_files a WHERE physical_name like 'G:\DEFAULT.DATA%'

38. 查询某个目录中哪些数据库占用了8G以上容量

SELECT b.name dbname,a.size*8/1024/1024 sum_GB,a.type_desc,a.name datafilename,a.physical_name FROM master.sys.master_files a join sys.sysdatabases b on a.database_id=b.dbid and a.physical_name like 'G:\DEFAULT.DATA%' and a.size*8/1024/1024>8

39. 查询实例上的每个数据库的大小

SELECT DB_NAME(db.database_id) DatabaseName, (CAST(mfrows.RowSize AS FLOAT)*8)/1024 RowSizeMB, (CAST(mflog.LogSize AS FLOAT)*8)/1024 LogSizeMB, (CAST(mfstream.StreamSize AS FLOAT)*8)/1024 StreamSizeMB, (CAST(mftext.TextIndexSize AS FLOAT)*8)/1024 TextIndexSizeMB FROM sys.databases db LEFT JOIN (SELECT database_id, SUM(size) RowSize FROM sys.master_files WHERE type = 0 GROUP BY database_id, type) mfrows ON mfrows.database_id = db.database_id LEFT JOIN (SELECT database_id, SUM(size) LogSize FROM sys.master_files WHERE type = 1 GROUP BY database_id, type) mflog ON mflog.database_id = db.database_id LEFT JOIN (SELECT database_id, SUM(size) StreamSize FROM sys.master_files WHERE type = 2 GROUP BY database_id, type) mfstream ON mfstream.database_id = db.database_id LEFT JOIN (SELECT database_id, SUM(size) TextIndexSize FROM sys.master_files WHERE type = 4 GROUP BY database_id, type) mftext ON mftext.database_id = db.database_id 40. 查询总耗CPU最多的前3个SQL,且最近5天出现过 SELECT TOP 3 total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数], qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)], last_execution_time AS [最后一次执行时间],max_worker_time /1000 AS [最大执行时间(ms)], SUBSTRING(qt.text,qs.statement_start_offset/2 1, (CASE WHEN qs.statement_end_offset = -1 THEN DATALENGTH(qt.text) ELSE qs.statement_end_offset END -qs.statement_start_offset)/2 1) AS [使用CPU的语法], qt.text [完整语法], qt.dbid, dbname=db_name(qt.dbid), qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName FROM sys.dm_exec_query_stats qs WITH(nolock) CROSS apply sys.dm_exec_sql_text(qs.sql_handle) AS qt WHERE execution_count>1 and last_execution_time>dateadd(dd,-5,getdate()) ORDER BY total_worker_time DESC

41. 查询平均耗CPU最多的前3个SQL,且最近5小时出现过

SELECT TOP 3 total_worker_time/1000 AS [总消耗CPU 时间(ms)],execution_count [运行次数], qs.total_worker_time/qs.execution_count/1000 AS [平均消耗CPU 时间(ms)], last_execution_time AS [最后一次执行时间],min_worker_time /1000 AS [最小执行时间(ms)], max_worker_time /1000 AS [最大执行时间(ms)], SUBSTRING(qt.text,qs.statement_start_offset/2 1, (CASE WHEN qs.statement_end_offset = -1 THEN DATALENGTH(qt.text) ELSE qs.statement_end_offset END -qs.statement_start_offset)/2 1) AS [使用CPU的语法], qt.text [完整语法], qt.dbid, dbname=db_name(qt.dbid), qt.objectid,object_name(qt.objectid,qt.dbid) ObjectName FROM sys.dm_exec_query_stats qs WITH(nolock) CROSS apply sys.dm_exec_sql_text(qs.sql_handle) AS qt WHERE execution_count>1 and last_execution_time>dateadd(hh,-5,getdate()) ORDER BY (qs.total_worker_time/qs.execution_count/1000) DESC

42. 查看当前最耗资源的10个SQL及其spid

SELECT TOP 10 session_id,request_id,start_time AS '开始时间',status AS '状态', command AS '命令',d_sql.text AS 'sql语句', DB_NAME(database_id) AS '数据库名', blocking_session_id AS '正在阻塞其他会话的会话ID', wait_type AS '等待资源类型',wait_time AS '等待时间',wait_resource AS '等待的资源', reads AS '物理读次数',writes AS '写次数',logical_reads AS '逻辑读次数', row_count AS '返回结果行数' FROM sys.dm_exec_requests AS d_request CROSS APPLY sys.dm_exec_sql_text(d_request.sql_handle) AS d_sql WHERE session_id>50 ORDER BY cpu_time DESC --前50号session_id一般是系统后台进程,sys.dm_exec_requests的status显示为background

43. 查询某个存储过程被哪些job调用了

SELECT * FROM msdb.dbo.sysjobs JOB WITH( NOLOCK) INNER JOIN msdb. dbo.sysjobsteps STP WITH(NOLOCK ) ON STP .job_id = JOB .job_id WHERE STP .command LIKE N'%sp_name%' --以上要查询某个job被哪个job调用了,把sp_name存储过程名字改成job_name作业名字即可

44. 命令执行某个job

EXECUTE msdb.dbo.sp_start_job N'job_name'

45. 查询某表标识列的列名

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME='表名' AND COLUMNPROPERTY(OBJECT_ID('表名'),COLUMN_NAME,'IsIdentity')=1

46. 获取标识列的种子值

SELECT IDENT_SEED ('表名')

47. 获取标识列的递增量

SELECT IDENT_INCR('表名')

48. 获取指定表中最后生成的标识值

SELECT IDENT_CURRENT('表名')

49. 重新设置标识种子值为XX

DBCC CHECKIDENT (表名, RESEED, XX)

50. 升级前,查询服务器名、实例名、版本号

select SERVERPROPERTY('machinename'),@@SERVERNAME,SERVERPROPERTY ('edition'),@@version

51. 用户被grant这样操作赋予的权限

use dbname exec sp_helprotect @username = 'username'

52. 授予某个用户执行某个数据库的sp的权限

use dbname grant execute to "username"

53. always on

-查看集群各节点的信息,包含节点成员的名称,类型,状态,拥有的投票仲裁数 SELECT * FROM sys.dm_hadr_cluster_members; -查看集群各节点的信息,包含节点成员的名称,节点成员上的sql实例名称 select * from sys.dm_hadr_instance_node_map -查看WSFC(windows server故障转移群集)的信息,包含集群名称,仲裁类型,仲裁状态 SELECT * FROM SYS.dm_hadr_cluster; -查看AG名称 select * from sys.dm_hadr_name_id_map -查看集群各节点的子网信息,包含节点成员的名称,子网段,子网掩码 SELECT * FROM sys.dm_hadr_cluster_networks; -查看侦听ip select * from sys.availability_group_listeners; -查看主从各节点的状态 select d.is_local,dc.database_name, d.synchronization_health_desc, d.synchronization_state_desc, d.database_state_desc from sys.dm_hadr_database_replica_states d join sys.availability_databases_cluster dc on d.group_database_id=dc.group_database_id; -查看辅助副本(传说中的从库)延迟多少M日志量 select db_name(database_id),log_send_queue_size/1024 delay_M,* from sys.dm_hadr_database_replica_states where is_primary_replica=0; select ar.replica_server_name, db_name(drs.database_id),drs.truncation_lsn, drs.log_send_queue_size, drs.redo_queue_size from sys.dm_hadr_database_replica_states drs join sys.availability_replicas ar on drs.replica_id=ar.replica_id where drs.is_local=0; select ar.replica_server_name, db_name(drs.database_id),drs.truncation_lsn, drs.log_send_queue_size,drs.log_send_rate, drs.redo_queue_size,drs.redo_rate from sys.dm_hadr_database_replica_states drs join sys.availability_replicas ar on drs.replica_id=ar.replica_id where drs.is_local=0 --log_send_queue_size 主数据库中尚未发送到辅助数据库的日志记录量 (KB) --log_send_rate 在最后一个活动期间,以千字节 (KB) 的平均主副本发送实例数据的速率/秒 --redo_queue_size 在最后一个活动期间,以千字节 (KB) 的平均主副本发送实例数据的速率/秒 --redo_rate 平均千字节 (KB) 中的给定辅助数据库做的日志记录速率 / 秒

54. 查询实例的FILESTREAM 使用的DIRECTORY_NAME

SELECT SERVERPROPERTY('FilestreamShareName')

55. 查询FILETABLE表的数据库对应的DIRECTORY_NAME

select db_name(database_id),* from sys.database_filestream_options 仅仅使用filestream功能时,数据库不需要对应的DIRECTORY_NAME

56. 查询FILETABLE表对应的DIRECTORY_NAME

select object_name(object_id),* from sys.filetables

57. 查询filetable表testdb.dbo.table1中的文件完整路径名称

SELECT FileTableRootPath() [file_stream].GetFileNamespacePath(),name FROM testdb.dbo.table1 58. 查询所有job的状态是否running SELECT sj.Name, CASE WHEN sja.start_execution_date IS NULL THEN 'Not running' WHEN sja.start_execution_date IS NOT NULL AND sja.stop_execution_date IS NULL THEN 'Running' WHEN sja.start_execution_date IS NOT NULL AND sja.stop_execution_date IS NOT NULL THEN 'Not running' END AS 'RunStatus' FROM msdb.dbo.sysjobs sj JOIN msdb.dbo.sysjobactivity sja ON sj.job_id = sja.job_id WHERE session_id = ( SELECT MAX(session_id) FROM msdb.dbo.sysjobactivity) order by RunStatus desc;

59. 锁表的四种用法

TABLOCKX SELECT * FROM table WITH (TABLOCKX) 查询过程中,其他会话无法查询、更新此表,直到查询过程结束 TABLOCK SELECT * FROM table WITH (TABLOCK) 查询过程中,其他会话可以查询,但是无法更新此表,直到查询过程结束 HOLDLOCK SELECT * FROM table WITH (HOLDLOCK) 查询过程中,其他会话可以查询,但是无法更新此表,直到查询过程结束 NOLOCK SELECT * FROM table WITH (NOLOCK) 查询过程中,其他会话可以查询、更新此表

60. 查询某个发布XX,发布的数据库对象的2种方法

发布数据库上执行(数据来源这三张表distribution.dbo.MSpublications、distribution.dbo.MSarticles、sysarticlecolumns) select a.article,a.source_object,a.destination_object,b.colid from (select article,article_id,source_object,destination_object from [distribution].[dbo].MSarticles where publication_id in ( select publication_id from [distribution].[dbo].MSpublications where publication='XX' ) ) a inner join (select * from replicate1.dbo.sysarticlecolumns) b on a.article_id=b.artid order by a.article 订阅数据库上执行 select distinct article from MSreplication_objects where publication='XX'

61. 查询发布信息,发布名称,发布名称对应的发布序号

Select * from distribution.dbo.MSpublications

62. 查询发布名里面的发布对象的信息,包含表、视图、存储过程等

Select * from distribution.dbo.MSarticles

63. 监控发布订阅是否有异常,执行以下5条语句即可

select * from [distribution].[dbo].[MSlogreader_history] WHERE error_id != 0 AND [time] >= DATEADD(HOUR, -1, GETDATE()) select * from [distribution].[dbo].[MSdistribution_history] WHERE error_id != 0 AND [time] >= DATEADD(HOUR, -1, GETDATE()) select * from [distribution].[dbo].[MSsnapshot_history] WHERE error_id != 0 AND [time] >= DATEADD(HOUR, -1, GETDATE()) select * from [distribution].[dbo].MSrepl_errors order by 2 desc select * from msdb.dbo.sysreplicationalerts order by 7 desc

64. 查询XX表的索引信息

SELECT a.name index_name,c.name table_name,d.name column_name FROM sysindexes a JOIN sysindexkeys b ON a.id=b.id AND a.indid=b.indid JOIN sysobjects c ON b.id=c.id JOIN syscolumns d ON b.id=d.id= AND b.colid=d.colid WHERE a.indid NOT IN(0,255) AND c.name in ('XX')

65. 生成sql语句的执行计划(select XXX为例,当然select XXX也可以换成执行存储过程比如exec pro_XXX,都是只生成执行计划,不产生结果集,不会执行存储过程)

SET SHOWPLAN_ALL ON; GO select XXX GO SET SHOWPLAN_ALL OFF; GO 或 SET SHOWPLAN_XML ON; GO select XXX GO SET SHOWPLAN_XML OFF; GO

66. 查询名称为XXX的job的最后一次运行成功的时间

SELECT TOP 1 CONVERT(DATETIME, RTRIM(run_date)) ((run_time / 10000 * 3600) ((run_time % 10000) / 100 * 60) (run_time % 10000) % 100) / (86399.9964) FROM msdb.dbo.sysjobhistory jobhis inner join msdb.dbo.sysjobs jobs on jobhis.job_id = jobs.job_id AND jobhis.step_id = 0 AND jobhis.run_status = 1 and jobs.name='XXX' ORDER BY 1 DESC

67. 查询某张分区表的总行数和大小,比如表为crm.EmailLog

exec sp_spaceused 'crm.EmailLog';

68. 查询某张分区表的信息,每个分区有多少行,比如表为crm.EmailLog

select convert(varchar(50), ps.name ) as partition_scheme, p.partition_number, convert(varchar(10), ds2.name ) as filegroup, convert(varchar(19), isnull(v.value, ''), 120) as range_boundary, str(p.rows, 9) as rows from sys.indexes i join sys.partition_schemes ps on i.data_space_id = ps.data_space_id join sys.destination_data_spaces dds on ps.data_space_id = dds.partition_scheme_id join sys.data_spaces ds2 on dds.data_space_id = ds2.data_space_id join sys.partitions p on dds.destination_id = p.partition_number and p.object_id = i.object_id and p.index_id = i.index_id join sys.partition_functions pf on ps.function_id = pf.function_id LEFT JOIN sys.Partition_Range_values v on pf.function_id = v.function_id and v.boundary_id = p.partition_number - pf.boundary_value_on_right WHERE i.object_id = object_id('crm.EmailLog') and i.index_id in (0, 1) order by p.partition_number

69. 查询分区函数

select * from sys.partition_functions

70. 查看分区架构

select * from sys.partition_schemes

71. 查询ssis包的信息

select * from msdb.dbo.sysssispackages

72. 查询某张表里的索引的大小,如下示例表为dbo.table1

SELECT i.name AS IndexName, SUM(page_count * 8) AS IndexSizeKB FROM sys.dm_db_index_physical_stats( db_id(), object_id('dbo.table1'), NULL, NULL, 'DETAILED') AS s JOIN sys.indexes AS i ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id GROUP BY i.name ORDER BY i.name

73. 重建表上的所有索引

alter index all on table_name rebuild with (online=on) 重建表上的某个索引 alter index index_name on table_name rebuild with (online=on) 重新组织表上的所有索引 alter index all on table_name reorganize 重新组织表上的某个索引 alter index index_name on table_name reorganize

74. 查看数据文件可收缩空间,结果见Availabesize_MB字段值

select name ,size*8/1024 as Totalsize_MB ,CAST(FILEPROPERTY(name,'SpaceUsed') AS int)*8/1024 as Usedsize_MB, size*8/1024 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)*8/1024 AS Availabesize_MB from sys.master_files where database_id=db_id(N'DBNAME') 75. 查询某个表中的全部索引的信息 declare @tableName varchar(50) = 'LbaListAlertDetail' declare @tableId int select @tableId = object_id from sys.objects where name = @tableName SELECT OBJECT_NAME(IX.OBJECT_ID) Table_Name ,IX.name AS Index_Name ,IX.type_desc Index_Type ,SUM(PS.[used_page_count]) * 8 IndexSizeKB ,IXUS.user_seeks AS NumOfSeeks ,IXUS.user_scans AS NumOfScans ,IXUS.user_lookups AS NumOfLookups ,IXUS.user_updates AS NumOfUpdates ,IXUS.last_user_seek AS LastSeek ,IXUS.last_user_scan AS LastScan ,IXUS.last_user_lookup AS LastLookup ,IXUS.last_user_update AS LastUpdate

FROM sys.indexes IX

INNER JOIN sys.dm_db_index_usage_stats IXUS ON IXUS.index_id = IX.index_id AND IXUS.OBJECT_ID = IX.OBJECT_ID

INNER JOIN sys.dm_db_partition_stats PS on PS.object_id=IX.object_id

WHERE OBJECTPROPERTY(IX.OBJECT_ID,'IsUserTable') = 1

and IX.OBJECT_ID = @tableId

GROUP BY OBJECT_NAME(IX.OBJECT_ID) ,IX.name ,IX.type_desc ,IXUS.user_seeks ,IXUS.user_scans ,IXUS.user_lookups,IXUS.user_updates ,IXUS.last_user_seek ,IXUS.last_user_scan ,IXUS.last_user_lookup ,IXUS.last_user_update

sqlserver中类似oracle的dba_source的视图是sys.sql_modules

76. 查询某个数据库下的表数据占用磁盘容量最大的10张表

use XX if exists(select 1 from tempdb..sysobjects where id=object_id('tempdb..#tabName') and xtype='u') drop table #tabName go create table #tabName( table_name varchar(100), rowsNum varchar(100), reserved_size varchar(100), data_size varchar(100), index_size varchar(100), unused_size varchar(100) ) declare @name varchar(100) declare cur cursor for select name from sysobjects where xtype='u' order by name open cur fetch next from cur into @name while @@fetch_status=0 begin insert into #tabName exec sp_spaceused @name fetch next from cur into @name end close cur deallocate cur select top 10 table_name, data_size,rowsNum ,index_size,unused_size ,reserved_size,convert(int,SUBSTRING(data_size,0,LEN(data_size)-2)) size from #tabName ORDER BY size desc 或 select top 10 a.tablename,a.SCHEMANAME,sum(a.TotalSpaceMB) TotalSpaceMB,sum(a.RowCounts) RowCounts from ( SELECT t.NAME AS TableName, s.Name AS SchemaName, p.rows AS RowCounts, SUM(a.total_pages) * 8 AS TotalSpaceKB, CAST(ROUND(((SUM(a.total_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS TotalSpaceMB, SUM(a.used_pages) * 8 AS UsedSpaceKB, CAST(ROUND(((SUM(a.used_pages) * 8) / 1024.00), 2) AS NUMERIC(36, 2)) AS UsedSpaceMB, (SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB, CAST(ROUND(((SUM(a.total_pages) - SUM(a.used_pages)) * 8) / 1024.00, 2) AS NUMERIC(36, 2)) AS UnusedSpaceMB FROM sys.tables t INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id LEFT OUTER JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE t.NAME NOT LIKE 'dt%' AND t.is_ms_shipped = 0 AND i.OBJECT_ID > 255 GROUP BY t.Name, s.Name, p.Rows) a GROUP BY a.tablename,a.SCHEMANAME order by sum(a.TotalSpaceMB) desc --这个比上一个专业 77. 查询某个数据库中是否有create index ' name CHAR(10)

select 'use ' name CHAR(10) 'select DB_NAME(),OBJECT_NAME(OBJECT_ID),definition from ' name '.sys.sql_modules WHERE objectproperty(OBJECT_ID, ''IsProcedure'') = 1 AND definition like ''%online%=%on%'' and definition like ''%index%''' from sys.databases;

78. 根据id号查询某个数据库名

SELECT DB_NAME(18) 根据id号查询某个对象名 SELECT OBJECT_NAME(1769220894)

79. 查看收缩的进度100%,此语句要到指定的数据库下执行

SELECT DB_NAME(database_id) AS Exec_DB ,percent_complete ,CASE WHEN estimated_completion_time < 36000000 THEN '0' ELSE '' END RTRIM(estimated_completion_time/1000/3600) ':' RIGHT('0' RTRIM((estimated_completion_time/1000)600/60), 2) ':' RIGHT('0' RTRIM((estimated_completion_time/1000)`), 2) AS [Time Remaining] ,b.text as tsql ,* FROM SYS.DM_EXEC_REQUESTS cross apply sys.dm_exec_sql_text(sql_handle) as b WHERE command LIKE 'DbccFilesCompact%' --and database_id=db_id('cardorder') ORDER BY 2 DESC

80. 查看重新组织索引的100%进度

SELECT DB_NAME(database_id) AS Exec_DB ,percent_complete ,CASE WHEN estimated_completion_time < 36000000 THEN '0' ELSE '' END RTRIM(estimated_completion_time/1000/3600) ':' RIGHT('0' RTRIM((estimated_completion_time/1000)600/60), 2) ':' RIGHT('0' RTRIM((estimated_completion_time/1000)`), 2) AS [Time Remaining] ,b.text as tsql ,* FROM SYS.DM_EXEC_REQUESTS cross apply sys.dm_exec_sql_text(sql_handle) as b WHERE command LIKE '%REORGANIZE%' --and database_id=db_id('cardorder') ORDER BY 2 DESC

81. 查看存储过程的执行计划

SELECT d.object_id , DB_NAME(d.database_id) DBName , OBJECT_NAME(object_id, database_id) 'SPName' , d.cached_time , d.last_execution_time , d.total_elapsed_time/1000000 AS total_elapsed_time, d.total_elapsed_time / d.execution_count/1000000 AS [avg_elapsed_time] , d.last_elapsed_time/1000000 AS last_elapsed_time, d.execution_count , d.total_physical_reads , d.last_physical_reads , d.total_logical_writes , d.last_logical_reads , et.text SQLText , eqp.query_plan executionplan FROM sys.dm_exec_procedure_stats AS d CROSS APPLY sys.dm_exec_sql_text(d.sql_handle) et CROSS APPLY sys.dm_exec_query_plan(d.plan_handle) eqp WHERE OBJECT_NAME(object_id, database_id) = 'xxxx' ORDER BY [total_worker_time] DESC;

82. 查看当前用户

select system_user

83. 查询ddl修改操作的记录

-执行如下找到trace文件的目录和名称 select * from Sys.traces -使用sqlserver profiler工具打开trace文件,就可以查到相关记录

原文链接:http://blog.itpub.net/30126024/viewspace-2638523/

另附SQL Server 行转列和列转行全解

行转列,列转行是我们在开发过程中经常碰到的问题。

行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 的运算符PIVOT来实现。

用传统的方法,比较好理解。层次清晰,而且比较习惯。 但是PIVOT 、UNPIVOT提供的语法比一系列复杂的SELECT…CASE 语句中所指定的语法更简单、更具可读性。下面我们通过几个简单的例子来介绍一下列转行、行转列问题。

我们首先先通过一个老生常谈的例子,学生成绩表(下面简化了些)来形象了解下行转列

CREATE TABLE [StudentScores] ( [UserName] NVARCHAR(20), --学生姓名 [Subject] NVARCHAR(30), --科目 [Score] FLOAT, --成绩 ) INSERT INTO [StudentScores] SELECT 'Nick', '语文', 80 INSERT INTO [StudentScores] SELECT 'Nick', '数学', 90 INSERT INTO [StudentScores] SELECT 'Nick', '英语', 70 INSERT INTO [StudentScores] SELECT 'Nick', '生物', 85 INSERT INTO [StudentScores] SELECT 'Kent', '语文', 80 INSERT INTO [StudentScores] SELECT 'Kent', '数学', 90 INSERT INTO [StudentScores] SELECT 'Kent', '英语', 70 INSERT INTO [StudentScores] SELECT 'Kent', '生物', 85

如果我想知道每位学生的每科成绩,而且每个学生的全部成绩排成一行,这样方便我查看、统计,导出数据

SELECT UserName, MAX(CASE Subject WHEN '语文' THEN Score ELSE 0 END) AS '语文', MAX(CASE Subject WHEN '数学' THEN Score ELSE 0 END) AS '数学', MAX(CASE Subject WHEN '英语' THEN Score ELSE 0 END) AS '英语', MAX(CASE Subject WHEN '生物' THEN Score ELSE 0 END) AS '生物' FROM dbo.[StudentScores] GROUP BY UserName

查询结果如图所示,这样我们就能很清楚的了解每位学生所有的成绩了

sql server的sql语句(SQLServer常用SQL语句)(1)

接下来我们来看看第二个小列子。有一个游戏玩家充值表(仅仅为了说明,举的一个小例子),

CREATE TABLE [Inpours] ( [ID] INT IDENTITY(1,1), [UserName] NVARCHAR(20), --游戏玩家 [CreateTime] DATETIME, --充值时间 [PayType] NVARCHAR(20), --充值类型 [Money] DECIMAL, --充值金额 [IsSuccess] BIT, --是否成功 1表示成功, 0表示失败 CONSTRAINT [PK_Inpours_ID] PRIMARY KEY(ID) ) INSERT INTO Inpours SELECT '张三', '2010-05-01', '支付宝', 50, 1 INSERT INTO Inpours SELECT '张三', '2010-06-14', '支付宝', 50, 1 INSERT INTO Inpours SELECT '张三', '2010-06-14', '手机短信', 100, 1 INSERT INTO Inpours SELECT '李四', '2010-06-14', '手机短信', 100, 1 INSERT INTO Inpours SELECT '李四', '2010-07-14', '支付宝', 100, 1 INSERT INTO Inpours SELECT '王五', '2010-07-14', '工商银行卡', 100, 1 INSERT INTO Inpours SELECT '赵六', '2010-07-14', '建设银行卡', 100, 1

下面来了一个统计数据的需求,要求按日期、支付方式来统计充值金额信息。这也是一个典型的行转列的例子。我们可以通过下面的脚本来达到目的

SELECT CONVERT(VARCHAR(10), CreateTime, 120) AS CreateTime, CASE PayType WHEN '支付宝' THEN SUM(Money) ELSE 0 END AS '支付宝', CASE PayType WHEN '手机短信' THEN SUM(Money) ELSE 0 END AS '手机短信', CASE PayType WHEN '工商银行卡' THEN SUM(Money) ELSE 0 END AS '工商银行卡', CASE PayType WHEN '建设银行卡' THEN SUM(Money) ELSE 0 END AS '建设银行卡' FROM Inpours GROUP BY CreateTime, PayType

如图所示,我们这样只是得到了这样的输出结果,还需进一步处理,才能得到想要的结果

sql server的sql语句(SQLServer常用SQL语句)(2)

SELECT CreateTime, ISNULL(SUM([支付宝]) , 0) AS [支付宝], ISNULL(SUM([手机短信]) , 0) AS [手机短信], ISNULL(SUM([工商银行卡]), 0) AS [工商银行卡], ISNULL(SUM([建设银行卡]), 0) AS [建设银行卡] FROM ( SELECT CONVERT(VARCHAR(10), CreateTime, 120) AS CreateTime, CASE PayType WHEN '支付宝' THEN SUM(Money) ELSE 0 END AS '支付宝' , CASE PayType WHEN '手机短信' THEN SUM(Money) ELSE 0 END AS '手机短信', CASE PayType WHEN '工商银行卡' THEN SUM(Money) ELSE 0 END AS '工商银行卡', CASE PayType WHEN '建设银行卡' THEN SUM(Money) ELSE 0 END AS '建设银行卡' FROM Inpours GROUP BY CreateTime, PayType ) T GROUP BY CreateTime

其实行转列,关键是要理清逻辑,而且对分组(Group by)概念比较清晰。上面两个列子基本上就是行转列的类型了。但是有个问题来了,上面是我为了说明弄的一个简单列子。实际中,可能支付方式特别多,而且逻辑也复杂很多,可能涉及汇率、手续费等等(曾经做个这样一个),如果支付方式特别多,我们的CASE WHEN 会弄出一大堆,确实比较恼火,而且新增一种支付方式,我们还得修改脚本如果把上面的脚本用动态SQL改写一下,我们就能轻松解决这个问题

DECLARE @cmdText VARCHAR(8000); DECLARE @tmpSql VARCHAR(8000); SET @cmdText = 'SELECT CONVERT(VARCHAR(10), CreateTime, 120) AS CreateTime,' CHAR(10); SELECT @cmdText = @cmdText ' CASE PayType WHEN ''' PayType ''' THEN SUM(Money) ELSE 0 END AS ''' PayType ''',' CHAR(10) FROM (SELECT DISTINCT PayType FROM Inpours ) T SET @cmdText = LEFT(@cmdText, LEN(@cmdText) -2) --注意这里,如果没有加CHAR(10) 则用LEFT(@cmdText, LEN(@cmdText) -1) SET @cmdText = @cmdText ' FROM Inpours GROUP BY CreateTime, PayType '; SET @tmpSql ='SELECT CreateTime,' CHAR(10); SELECT @tmpSql = @tmpSql ' ISNULL(SUM(' PayType '), 0) AS ''' PayType ''',' CHAR(10) FROM (SELECT DISTINCT PayType FROM Inpours ) T SET @tmpSql = LEFT(@tmpSql, LEN(@tmpSql) -2) ' FROM (' CHAR(10); SET @cmdText = @tmpSql @cmdText ') T GROUP BY CreateTime '; PRINT @cmdText EXECUTE (@cmdText);

下面是通过PIVOT来进行行转列的用法,大家可以对比一下,确实要简单、更具可读性

SELECT CreateTime, [支付宝] , [手机短信],[工商银行卡] , [建设银行卡] FROM ( SELECT CONVERT(VARCHAR(10), CreateTime, 120) AS CreateTime,PayType, Money FROM Inpours ) P PIVOT ( SUM(Money) FOR PayType IN ([支付宝], [手机短信], [工商银行卡], [建设银行卡]) ) AS T ORDER BY CreateTime

有时可能会出现这样的错误:

消息 325,级别 15,状态 1,第 9 行

‘PIVOT’ 附近有语法错误。您可能需要将当前数据库的兼容级别设置为更高的值,以启用此功能。有关存储过程 sp_dbcmptlevel 的信息,请参见帮助。

这个是因为:对升级到 SQL Server 2005 或更高版本的数据库使用 PIVOT 和 UNPIVOT 时,必须将数据库的兼容级别设置为 90 或更高。有关如何设置数据库兼容级别的信息,请参阅 sp_dbcmptlevel (Transact-SQL)。 例如,只需在执行上面脚本前加上 EXEC sp_dbcmptlevel Test, 90; 就OK了, Test 是所在数据库的名称。

下面我们来看看列转行,主要是通过UNION ALL ,MAX来实现。假如有下面这么一个表

Create Table ProgrectDetail ( ProgrectName NVARCHAR(20), --工程名称 OverseaSupply INT, --海外供应商供给数量 NativeSupply INT, --国内供应商供给数量 SouthSupply INT, --南方供应商供给数量 NorthSupply INT --北方供应商供给数量 ) INSERT INTO ProgrectDetail SELECT 'A', 100, 200, 50, 50 UNION ALL SELECT 'B', 200, 300, 150, 150 UNION ALL SELECT 'C', 159, 400, 20, 320 UNION ALL SELECT 'D', 250, 30, 15, 15

我们可以通过下面的脚本来实现,查询结果如下图所示

SELECT ProgrectName, 'OverseaSupply' AS Supplier, MAX(OverseaSupply) AS 'SupplyNum' FROM ProgrectDetail GROUP BY ProgrectName UNION ALL SELECT ProgrectName, 'NativeSupply' AS Supplier, MAX(NativeSupply) AS 'SupplyNum' FROM ProgrectDetail GROUP BY ProgrectName UNION ALL SELECT ProgrectName, 'SouthSupply' AS Supplier, MAX(SouthSupply) AS 'SupplyNum' FROM ProgrectDetail GROUP BY ProgrectName UNION ALL SELECT ProgrectName, 'NorthSupply' AS Supplier, MAX(NorthSupply) AS 'SupplyNum' FROM ProgrectDetail GROUP BY ProgrectName

sql server的sql语句(SQLServer常用SQL语句)(3)

用UNPIVOT 实现如下

SELECT ProgrectName,Supplier,SupplyNum FROM ( SELECT ProgrectName, OverseaSupply, NativeSupply, SouthSupply, NorthSupply FROM ProgrectDetail )T UNPIVOT ( SupplyNum FOR Supplier IN (OverseaSupply, NativeSupply, SouthSupply, NorthSupply ) ) P

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页