鉴于本人健忘,特新建一篇日志用于记录项目开发中觉得需要记录下来的SQL语句,以备日后之需
一、从A表中获取特定字段数据批量insert到B表
注意:不需要Values关键字(没有验证过加上values是否可以),TableA与TableB的字段需要对应。
insert into TableA ( userName ) (select UserName from TableB where [Status] =1 )
二、从数据库中随即取N条记录,这也是我在一家公司遇到的笔试题,当时不会,汗颜啊!!
这是最简单的方法,通过调用SqlServer的newid()函数(产生GUID—全局唯一标志符)来产生随机记录。
采用这种方法时,需要将表中所有记录与newid()生成的值进行比较从而进行排序。因此,如果表中的记录较多,操作会非常缓慢。
select top N * From Table order by NEWID()
三、显式对设置identity(1,1)的数据表插入自定义数据
如果一个数据表设置了主键并且自增长的话,ID会按照设置的递增种子累加,如1、2、3、4……,但是,如果我需要下一条记录将ID设置为6而不是默认的增长ID5的话,则需要设置打开 identity_insert
set identity_insert Table ON
insert into Table (ID,name) values( 6,'Tom')
--必须写上需要插入的字段,即使insert的是全部字段,否则的话,
--会报“仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'Table'中的标识列指定显式值”的错误
四、使用下面语句查看执行的查询计划,我的理解应该历史执行过的sql语句,还驻留在sqlserver的缓存之中
SELECT * FROM sys.syscacheobjects
我们也可以关注下面四个字段,usecounts为使用的次数,表示该计划用了多少次,而sql字段为是执行了哪个sql语句SELECT cacheobjtype,objtype,usecounts,sql FROM sys.syscacheobjects
五、Sqlserver自动增长列归零
一个项目完成后数据库中会有很多无用的测试数据,可以使用delete * 将数据全部删除,但自增长列(一般是主键)基数不会归零,使用TRUNCATE函数可以将表中数据全部删除,并且将自增长列基数归零。一定要注意,表中的数据全部删除了。它的语法如下:
TRUNCATE TABLE tableName --其中tableName中所要操作的数据
六、使用Sql语句添加新字段,因为数据量很大的表使用设计器新增表字段的时候,往往出现超时,所以,解决方法可以使用sql语句。
alter table [TableName] add [字段名] bigint default 0 not null
七、SQL语句处理事务以及Try……Catch捕抓异常后回滚事务
BEGIN TRY --开始Try
BEGIN TRANSACTION; --开始事务
insert into [EtradeNowDB].[dbo].[T_HelpEnterprise] (EntId,CreditGrade,UserName) --不会出错的sql语句
values(9999999,1,11)
insert into [EtradeNowDB].[dbo].[T_HelpEnterprise] (EntId,CreditGrade,UserName) --会出错的sql语句
values(null,1,11)
COMMIT TRANSACTION; --提交事务
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION; --回滚事务
END CATCH;
sql语句解释:事务中,执行2条sql语句,第一条不会出错,第二条将null插入一个不允许插入null的字段,所以第二条肯定会出错的,执行该sql,程序发现错误的时候,会自动回滚,也就是第一条记录也不会执行,保证了数据的完整性
续……