SQL SERVER 数据库实用SQL(1)原创
金蝶云社区-云端迈步
云端迈步
9人赞赏了该文章 1,201次浏览 未经作者许可,禁止转载编辑于2023年12月18日 19:05:32

前言:使用SQL的过程中,有些用得到,但并不特别常用的SQL,有时需要到网上找资料,再自行测试验证,

等到要用的时候还需要花费不少的时间。

下面对一些实用的 SQL进行分享:

--有些是基于KIS旗舰版、专业版的数据结构

【特别申明】此文章的内容是本人在使用过程中收集到的,以实用为主,不作为SQL SERVER的官方内容,

希望对读者有所帮助。

本文章有可能存在不完整或错漏,或描述不准确之处,作者不承担使用此文章带来的任何不良后果,敬请谅解。

请读者自行决定是否使用。

本文章的SQL基于SQL SERVER 2016 版本环境测试验证通过,在其他数据库环境比如ORACLE、MYSQL中可能不适用。

SQL2000或更低的SQL版本可能存在不兼容的情况。


一、已有数据库的备份文件,需要查询是哪个版本的数据库备份出来的

示例:  f:\db\D02Chw003.bak 文件,查询语法:

Restore HeaderOnly From Disk ='f:\db\D02Chw003.bak'


查询效果如下图


image.png

图1


查询出来的结果中 852 是内部版本号,以下是从网上查到的SQL版本与内部版本号的对应关系 

其中内部版本号661,也有网上文章说是SQL Server 2008的,实际上某次在SQL2008R2环境备份出来的BAK谁的,查询到的内部版本号是661,如果要恢复数据库,高版本的数据库环境可恢复低版本的备份。

另外,SQL  Server 2017因手上没有相关的环境,也没找到具体的数据,暂未列入

(如下所示:内部版本号904对应于SQL Server 2019


SQL Server 2019   904

SQL Server 2016   852

SQL Server 2014   782

SQL Server 2012   706

SQL Server 2008 R2   665  661

SQL Server 2008         655

SQL Server 2005 with vardecimal enabled   612

SQL Server 2005   611

SQL Server 2000   539

SQL Server 7   515


二、 查询数据库的逻辑名


SQL示例:

use  AIS20230518075307

SELECT name,physical_name  FROM sys.database_files



image.png

图2


SQL示例:(根据备份文件查询其逻辑名)

restore filelistonly from DISK = 'F:\01\A515cd.bak'

image.png

图3


三、收缩数据库的日志文件

适用场景:日志文件不是特别重要,比如非生产数据库,恢复数据库后,日志文件特别大,可能10G或更大

收缩后,日志文件可能不超过50K


SQL示例:其中 C4Bszah111是数据库名,SCM102SP2_Log是日志文件的逻辑名

use C4Bszah111

ALTER DATABASE C4Bszah111 SET RECOVERY SIMPLE WITH NO_WAIT

ALTER DATABASE C4Bszah111 SET RECOVERY SIMPLE --简单模式

DBCC SHRINKFILE (N'SCM102SP2_Log' , 11, TRUNCATEONLY) 



四、字段改长度并增加默认值

SQL示例:以下3行中,正常从第2行开始执行,有可能提示有XXX名的约束,则将约束名复制到第1行,

再按1-2-3行的顺序执行:

alter table T_FA_CARD_l drop constraint DF__T_FA_CARD__FNAME__5D440CDB

alter table T_FA_CARD_l alter column FNAME nvarchar(255) not null

ALTER TABLE T_FA_CARD_l add  DEFAULT (('')) for FNAME


五、用SQL恢复数据库时,指定物理文件的位置及名称:

QL示例:

RESTORE DATABASE [test23]   --为待还原库名

FROM 

  DISK = 'F:\05\AAA6.BAK'     --备份文件的位置

WITH

  MOVE 'SCM102SP2_Data' --数据文件逻辑名字

  TO 'F:\05\AAA6.MDF',   --指定数据文件路径

  MOVE 'SCM102SP2_log'  TO 'F:\05\AAA6.lDF',

STATS = 10, REPLACE


六、修复数据库逻辑错误


SQL示例:

需要数据库在独占访问的情况下使用(有可能要重启SQL SERVER服务),如果损坏不严重则可以修复。

修复成功标志:

1、下列所有SQL指令执行成功;

2、成功执行最后一行 DBCC CHECKDB 后,结果中倒数第二行的错误数量都为0。

use master

go

ALTER DATABASE AIS20200720184737 SET EMERGENCY

ALTER DATABASE AIS20200720184737 SET SINGLE_USER

dbcc checkdb(AIS20200720184737,REPAIR_ALLOW_DATA_LOSS)

dbcc checkdb(AIS20200720184737,REPAIR_REBUILD) 

ALTER DATABASE AIS20200720184737 SET  MULTI_USER

ALTER DATABASE AIS20200720184737 SET ONLINE

DBCC CHECKDB(AIS20200720184737)


七、查看耗时长的SQL


SELECT TOP 50

qs.total_worker_time/qs.execution_count as [Avg CPU Time],qt.text,

SUBSTRING(qt.text,qs.statement_start_offset/2, 

(case when qs.statement_end_offset = -1 

then len(convert(nvarchar(max), qt.text)) * 2 

else qs.statement_end_offset end -qs.statement_start_offset)/2) 

as query_text,

qt.dbid, dbname=db_name(qt.dbid),

qt.objectid 

FROM sys.dm_exec_query_stats qs

cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt

ORDER BY [Avg CPU Time] DESC


、MSDE(SQL 桌面版)的实例名 SQLEXPRESS

在安装了MSDE的服务器上,可以用简化版的SQL客户端登录,服务器名可参考以下文本,用WINDOWS身份验证

.\SQLEXPRESS


九、查询另一个台服务器的SQL

SQL示例:(需要知道另外服务器的IP、账号、密码)

select * FROM  OPENDATASOURCE('SQLOLEDB',

'Data Source=172.20.36.28;User ID=sa;Password=sa123Q8!0'

).A510SS.dbo.icstockbill


十、日期函数示例:

  --日期计算 :天数差异 日期函数,后面的日期减去前面的日期,后面日期更早时,结果为负

 SELECT  DATEDIFF( Day,'2022-6-30','2020-11-20' ),DATEDIFF (Day,'2022-6-30','2019-09-27' ) 

  ,DATEDIFF (Day,'2022-6-30','2019-4-16' )

  --差多少天后的日期,负数为以前的日期

 SELECT DATEADD (DD,-396,'2022-6-30')

--日期计算函数 日期加三年

dateadd(year,3,e.FPRODUCEDATE)

--三年少一天

dateadd(day,-1, dateadd(year,3,e.FPRODUCEDATE))

--本月第一天

SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

--下个月第一天

select CONVERT(varchar(10),DATEADD(m,1 ,dateadd(dd,-day(getdate())+1,getdate())) ,111)

select CONVERT(DATE,DATEADD(m,1 ,dateadd(dd,-day(getdate())+1,getdate())) ,111)

--下个月最后一天:

SELECT convert(varchar(10),dateadd(d,-1,dateadd(m,1,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))),111)

SELECT convert(DATE,dateadd(d,-1,dateadd(m,1,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))),111)


--所在月最后时刻到毫秒

select dateadd(ms,-3,DATEADD(mm,DATEDIFF(m,0,'2022-2-19')+1,0))


十一、查数据库大小,先 USE 待查数据库,单位为MB:

use SCM

select name, convert(float,size) * (8192.0/1024.0)/1024.  MB,FILENAME from sysfiles


十二、查询SQL SERVER服务器的版本

select @@version

下图所示是SSMS(SQL SERVER查询分析器,可理解为SQL客户端)版本是SQL2008R2,

连接到了SQL2012版本的数据库服务器

image.png

图4


图标赞 9
9人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!