sqlserver基本操作语法
写在前面
sqlserver的基本语法,和Orcal、mysql还是有些区别的。具体的区别会在另一个篇幅去解读。这里我主要结合实时工作应用总结一下sqlserver数据库的基本操作。
1.数据表备份
select * into A_tmp from A ; --A表数据库的表、A_tmp 是备份表
2.表结构修改
- 修改字段类型
alter table A alter COLUMN A.clmn varchar(80); - 修改表名:
EXEC sp_rename ‘原有表名’, ‘新表名’; - 修改列名:
EXEC sp_rename ‘表名.[原有列名]’, ‘新列名’ , ‘COLUMN’; - 修改主键
思路是先删除主键、修改新的主键列为非空,添加主键
alter table A drop constraint PK_A ; --PK_TableName原主键名称,删除原来的主键
alter table A alter column A.clmn varchar(60) not null ;–修改数据类型
alter table A add constraint PK_A
primary key clustered(clmn1,clmn2,clmn); --重新创建主键 - 添加表字段注释
execute sp_addextendedproperty ‘MS_Description’,‘列1’,‘user’,‘dbo’,‘table’,‘LES_EP_FX’,‘column’,‘CURR1’;
3.锁表与解锁
- 查看锁表
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName
from sys.dm_tran_locks where resource_type='OBJECT';
- 解锁
declare @spid int
Set @spid = 66 --锁表进程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)
4.查看所有表及字段注释
SELECT
表名 = Case When A.colorder=1 Then D.name Else '' End,
表说明 = Case When A.colorder=1 Then isnull(convert(varchar(100),F.value),'') Else '' End,
--字段序号 = A.colorder,
字段名 = A.name,
字段说明 = isnull(convert(varchar(100),G.[value]),'')
--标识 = Case When COLUMNPROPERTY( A.id,A.name,'IsIdentity')=1 Then '√'Else '' End,
-- 主键 = Case When exists(SELECT 1 FROM sysobjects Where xtype='PK' and parent_obj=A.id 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,'')
FROM
syscolumns A
Left Join systypes B On
A.xusertype = 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 G on
A.id = G.major_id
and A.colid = G.minor_id
Left Join sys.extended_properties F On
D.id = F.major_id
and F.minor_id = 0
-- where d.name='table_name' --如果只查询指定表,加上此条件
Order By
A.id,
A.colorder ;
5.字段类别对比
sql server中的varchar和Nvarchar有什么区别?
**varchar(n):**长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。
**nvarchar(n):**包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。
–例:两字段分别有字段值:我和coffee
–那么varchar字段占2×2+6=10个字节的存储空间,而nvarchar字段占8×2=16个字节的存储空间。
结论:如字段值只是英文可选择varchar,而字段值存在较多的双字节(中文、韩文等)字符时用nvarchar
datetime 和date的区别
**date类型:**是SQL Server 2008开始新引进的一种数据类型,他只包含日期 不包含小数部分 可以表示的日期范围为 0001 年 1 月 1 日 -到 9999 年 12 月 31 日 需要3个字节的存储空间
**datetime:**包含日期和时间部分,可以表示的范围为1753年1月1日 00:00:00到9999年12月31日 23:59:59:997 精度为 3.33 毫秒 占8个字节
–默认时间 1900-01-01 00:00:00
结论:存储年月日格式,用date类型,存储年年月日时分秒类型用datetime
6.查看数据库所有表占用空间
select
A.REC_RCODE,
A.PAY_RCODE,
case
when A.REC_RCODE = 'FIXED'
and A.PAY_RCODE = '' then '02'
when A.REC_RCODE = ''
and A.PAY_RCODE = 'FIXED' then '01'
else null end AS BUYERSellr
from
les_data.dbo.LES_DERIVATIVE_MTM A
where
A.GL_PRODUCT_CODE in ( '320','590');
select object_name(id) tablename,8*reserved/1024 reserved,rtrim(8*dpages/1024)+'Mb' used,8*(reserved-dpages)/1024 unused,8*dpages/1024-rows/1024*minlen/1024 free,
rows from sysindexes
where indid=1
order by reserved desc
#####7.一些常用的函数
- 去除字符空格 LTrim(RTrim( ))
- 生成8为随机数 RIGHT(100000000 + CONVERT(bigint, ABS(CHECKSUM(NEWID()))), 8)
- 将字符串格式的 2019-06-30 转为 20190630 convert(char(8),A.dt_date,112) AS dt_date