随笔分类 - Sql Server
记录SQL学习
sqlserver 创建分区表
摘要:大凡在应用系统和数据库系统中行走江湖多年的朋友,都会面临数据统计、分析以及归档的问题,企业信息化进程加速了各种数据的极具增长,商务智能(BI)的出现和实施着实给信息工作者和决策者带来了绝妙的体验,但从 OLTP 向 OLAP 系统加载数据是很头疼的事,常常需要数分钟或数小时,解 决这一问题的技术之一便是分区表,一旦实施了分区表,这样的操作往往只需几秒钟,太让人兴奋了。而大型表或索引经过分区后更容易进行管理,因为这样可以快 速高效地管理和访问数据子集,同时维护数据集合的完整性。分区表的数据分布于一个数据库中的多个文件组单元中,数据是按水平方式分区的(数据分区的多种方 式会在分区表前传中阐述),因
阅读全文
SQLserver锁和事务隔离级别的比较与使用
摘要:对象①锁:每条SQL语句②隔离:事务锁①并发问题丢失更新未确认的读取(脏读)不一致的分析(非重复读):多次读取相同的数据(行)不一致(其他用户更改update)幻像读:多次读取有不存在和新增的数据(其他用户插入insert或删除delete)隔离级别隔离级别脏读不可重复读取幻像说明未提交读(read uncommitted)是是是如果其他事务更新,不管是否提交,立即执行提交读(read committed默认)否是是读取提交过的数据。如果其他事务更新没提交,则等待可重复读(repeatable read)否否是查询期间,不允许其他事务update可串行读(serializable)否否否查询期
阅读全文
快速搞懂 SQL Server 的锁定和阻塞
摘要:本帖提供两种做法,可避免在 SQL Server 事务锁定时产生的不正常或长时间阻塞,让用户和程序也无限期等待,甚至引起 connection pooling 连接数超过容量。所谓的「阻塞」,是指当一个数据库会话中的事务,正在锁定其他会话事务想要读取或修改的资源,造成这些会话发出的请求进入等待的状态。SQL Server 默认会让被阻塞的请求无限期地一直等待, 直到原来的事务释放相关的锁,或直到它超时 (根据 SET LOCK_TIMEOUT,本文后续会提到)、服务器关闭、进程被杀死。一般的系统中,偶尔有短时间的阻塞是正常且合理的;但若设计不良的程序,就可能导 致长时间的阻塞,这样就不必要地锁
阅读全文
聚集索引与非聚集索引
摘要:微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)…… (一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别: 其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻...
阅读全文
在sqlserver中with(nolock)详解
摘要:在查询语句中使用 NOLOCK 和 READPAST处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAST 。有关 NOLOCK 和 READPAST的一些技术知识点:对于非银行等严格要求事务的行业,搜索记录中出现或者不出现某条记录,都是在可容忍范围内,所以碰到死锁,应该首先考虑,我们业务逻辑是否能容忍出现或者不出现某些记录,而不是寻求对双方都加锁条件下如何解锁的问题。NOLOCK 和 READPAST 都是处理查询、插入、删除等操作时候,如何应对锁住的数据记录。但是这时候一定要注意NOLOCK 和 READPAST的局限性,确认你的业务逻辑可以容忍这些记录的
阅读全文
SQL Server 数据库最小宕机迁移方案(转)
摘要:一、目的在做SQL Server数据库维护的时候,当上司要求我们把几十G的数据文件搬动到其它服务器,并且要求最小宕机时间的时候,我们有没什么方案可以做到这些要求呢?在这里我们假设这两台机器并不是在一个机房上,这样看起来我们的解决方案才更有意义,如果你那么好运这两台机器在同一个局域网,那么恭喜你,你可以多很多的方案可以做到。二、分析与设计思路其实我们假设的环境有两个特点:第一个是数据库文件比较大;第二个就是我们的传送文件的速度可能会比较慢。也许这传送速度我们是没有办法了,但是我们可以就从文件的大小这个问题出发,结合SQL Server的特性,这样就有了下面的解决方案了。为了使宕机时间最短,我们这
阅读全文
一个好用的sql位移函数
摘要:CREATE FUNCTION [dbo].[BitMove](@long bigint,@operator varchar(3),@len int) RETURNS bigint AS BEGIN if @len=0 return @long declare @i bigint declare @j bigint set @i=cast(0x8000000000000000 as bigint) set @j=cast(0x4000000000000000 as bigint) if @operator='<<' begin while @len>0 beg
阅读全文
sql语句大集合(转)
摘要:-语句功能--数据操作select--从数据库表中检索数据行和列insert--向数据库表添加新数据行delete--从数据库表中删除数据行update--更新数据库表中的数据--数据定义createtable--创建一个数据库表droptable--从数据库中删除表altertable--修改数据库表结构createview--创建一个视图dropview--从数据库中删除视图createindex--为数据库表创建一个索引dropindex--从数据库中删除索引createprocedure--创建一个存储过程dropprocedure--从数据库中删除存储过程createtrigger-
阅读全文
sqlserver灵活获取一个随机数的方法
摘要:select cast(ceiling(rand() * 5) as int)
阅读全文
SQL Server 2008 无法保存表的更改
摘要:MS SQL Server 2008 在建完表后,如果要重新设计表,如修改字段长度,就会提示:“当用户在在SQL Server 2008企业管理器中更改表结构时,必须要先删除原来的表,然后重新创建新表,才能完成表的更改,如果强行更改会出现以下提示:不允许保存更改。您所做的更改要求删除并重新创建以下表。您对无法重新创建的标进行了更改或者启用了“阻止保存要求重新创建表的更改&r...
阅读全文
使用SELECT赋值时再用ORDER BY排序所产生的问题
摘要:欲使用SELECT语句给变量@ColumnNames 赋值,并使用逗号分隔开,如下语句:select @ColumnNames = @ColumnNames + '[' + cell + '],' from #tblCell这样完全 没有问题,会得到这样的结果:A,B,C,D,E但是如果想要对表排序后 赋值,我的想法自然是:select @ColumnNames = @ColumnNames + ...
阅读全文
SQL中获得EXEC后面的sql语句或者存储过程的返回值的方法
摘要:前言:在数据库程序开发的过程中,我们经常会碰到利用EXEC来执行一段需要返回某些值的sql语句(通常是构造动态sql语句时使用),或者在一个存储过程中利用EXEC调用另一个有返回值的存储过程(必须获得返回值),那么如何获得这些返回值呢? 1,EXEC执行sql语句的情况 declare@rsqlvarchar(250)declare@csqlvarchar(300)declare@rcnvarc...
阅读全文
Sql Server中你可能不知道的统计记录数量的count函数
摘要:我们都知道,Count函数即可以像其他聚合函数一样使用字段名做为参数, 也可以使用星号(*) 做为参数,如:select Count(*) from UserList与select Count(UserName) from UserList,执行结果为100及100,执行结果一样。因为数据库设计为UserName为非空字段。假如该表中有另外一个字段,TelphoneNumber,该字段可为NULL...
阅读全文
SQL Server中删除重复数据的几个方法详解
摘要:方法一declare @max integer,@id integerdeclare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) > 1open cur_rowsfetch cur_rows into @id,@maxwhile @@fetch_status=0begin...
阅读全文
SQL Server中删除重复数据最快的方法详解
摘要:由于种种原因,在数据库中出现了我们不希望出现的重复数据,当对这些重复的数据进行删除的时候有许多种方法。我发现在网上流行的一种方法是利用临时表的方法,SQL脚本如下: select distinct * into #Tmp from tableName drop table tableName select * into tableName from #Tmp drop table #Tmp 该方...
阅读全文
在SQL Server和Access中清空表并重新开始编号的方法
摘要:SQL Server: Truncate是SQL中的一个删除数据表内容的语句,用法是: 语法 TRUNCATE TABLE name 参数 name 是要截断的表的名称或要删除其全部行的表的名称。 下面是对Truncate语句在MSSQLServer2000中用法和原理的说明: Truncate table 表名 速度快,而且效率高,因为: TRUNCATE T...
阅读全文
SQL2005中返回修改后的数据
摘要:这种技术主要是用到了inserted和deleted虚拟表,这两张表相信大家都很熟悉。以前我们主要是在触发器中使用。 我们先来复习下这两个表:Inserted和Deleted这两个表是逻辑表,并且这两个表是由系统管理的,存储在内存中,不是存储在数据库中,因此,不允许用户直接对其修改。这两个表的结构与被该触发器作用的表在相同的表结构。这两个表是动态驻留在内存中的,当触发器工作完成,它们也被删除。 ...
阅读全文
SQL Server 2005新功能
摘要:举几个例子来简单说明 这些例子我引用了Northwind库。 1. TOP 表达式 SQL Server 2000的TOP是个固定值,是不是觉得不爽,现在改进了。--前n名的订单declare@nint set@n=10 selectTOP(@n)*fromOrders 2. 分页 不知各位过去用SQL Server 2000是怎么分页的,大多都用到了临时表。SQL Server 2005一句话就...
阅读全文