一切福田,不離方寸,從心而覓,感無不通。

Category Archives: Database

SQL Server游标的使用【转】

游标是邪恶的!        在关系数据库中,我们对于查询的思考是面向集合的。而游标打破了这一规则,游标使得我们思考方式变为逐行进行.对于类C的开发人员来着,这样的思考方式会更加舒服。        正常面向集合的思维方式是:                而对于游标来说:               这也是为什么游标是邪恶的,它会使开发人员变懒,懒得去想用面向集合的查询方式实现某些功能.       同样的,在性能上,游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量……       从游标对数据库的读取方式来说,不难看出游标为什么占用更多的资源,打个比方:                  当你从ATM取钱的时候,是一次取1000效率更高呢,还是取10次100?     既然游标这么“邪恶”,为什么还要学习游标       我个人认为存在既是合理.归结来说,学习游标原因我归纳为以下2点     1.现存系统有一些游标,我们查询必须通过游标来实现     2.作为一个备用方式,当我们穷尽了while循环,子查询,临时表,表变量,自建函数或其他方式扔来无法实现某些查询的时候,使用游标实现.   T-SQL中游标的生命周期以及实现     在T-SQL中,游标的生命周期由5部分组成 1.定义一个游标      在T-SQL中,定义一个游标可以是非常简单,也可以相对复杂,取决于游标的参数.而游标的参数设置取决于你对游标原理的了解程度.      游标其实可以理解成一个定义在特定数据集上的指针,我们可以控制这个指针遍历数据集,或者仅仅是指向特定的行,所以游标是定义在以Select开始的数据集上的:                T-SQL中的游标定义在MSDN中如下:  

            看起来很让人头痛是吧.下面仔细讲一下如何定义游标:    游标分为游标类型和游标变量,对于游标变量来说,遵循T-SQL变量的定义方法(啥,不知道T-SQL变量定义的规则?参考我前面的博文).游标变量支持两种方式赋值,定义时赋值和先定义后赋值,定义游标变量像定义其他局部变量一样,在游标前加”@”,注意,如果定义全局的游标,只支持定义时直接赋值,并且不能在游标名称前面加“@”,两种定义方式如下:          下面我们来看游标定义的参数:      LOCAL和GLOBAL二选一      LOCAL意味着游标的生存周期只在批处理或函数或存储过程中可见,而GLOBAL意味着游标对于特定连接作为上下文,全局内有效,例如:            如果不指定游标作用域,默认作用域为GLOBAL        FORWARD_ONLY 和 SCROLL 二选一      FORWARD_ONLY意味着游标只能从数据集开始向数据集结束的方向读取,FETCH NEXT是唯一的选项,而SCROLL支持游标在定义的数据集中向任何方向,或任何位置移动,如下图:                STATIC  KEYSET  DYNAMIC  和 FAST_FORWARD 四选一     这四个关键字是游标所在数据集所反应的表内数据和游标读取出的数据的关系     STATIC意味着,当游标被建立时,将会创建FOR后面的SELECT语句所包含数据集的副本存入tempdb数据库中,任何对于底层表内数据的更改不会影响到游标的内容.     DYNAMIC是和STATIC完全相反的选项,当底层数据库更改时,游标的内容也随之得到反映,在下一次fetch中,数据内容会随之改变     KEYSET可以理解为介于STATIC和DYNAMIC的折中方案。将游标所在结果集的唯一能确定每一行的主键存入tempdb,当结果集中任何行改变或者删除时,@@FETCH_STATUS会为-2,KEYSET无法探测新加入的数据     FAST_FORWARD可以理解成FORWARD_ONLY的优化版本.FORWARD_ONLY执行的是静态计划,而FAST_FORWARD是根据情况进行选择采用动态计划还是静态计划,大多数情况下FAST_FORWARD要比FORWARD_ONLY性能略好.       READ_ONLY  SCROLL_LOCKS  OPTIMISTIC 三选一      READ_ONLY意味着声明的游标只能读取数据,游标不能做任何更新操作 […]

龙生   03 Feb 2016
View Details

SQLSERVER游标及循环语句

整理一下,关于游标,MSDN有: 过 Transact-SQL 服务器游标检索特定行。   参数 NEXT 紧跟当前行返回结果行,并且当前行递增为返回行。如果 FETCH NEXT 为对游标的第一次提取操作,则返回结果集中的第一行。NEXT 为默认的游标提取选项。 PRIOR 返回紧邻当前行前面的结果行,并且当前行递减为返回行。如果 FETCH PRIOR 为对游标的第一次提取操作,则没有行返回并且游标置于第一行之前。 FIRST 返回游标中的第一行并将其作为当前行。 LAST 返回游标中的最后一行并将其作为当前行。 ABSOLUTE { n | @nvar} 如果 n 或 @nvar 为正,则返回从游标头开始向后的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar为负,则返回从游标末尾开始向前的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar 为 0,则不返回行。n 必须是整数常量,并且 @nvar 的数据类型必须为 smallint、tinyint 或 int。 RELATIVE { n | @nvar} 如果 n 或 @nvar 为正,则返回从当前行开始向后的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar为负,则返回从当前行开始向前的第 n 行,并将返回行变成新的当前行。如果 n 或 @nvar 为 0,则返回当前行。在对游标进行第一次提取时,如果在将 n 或 @nvar 设置为负数或 0 的情况下指定 FETCH RELATIVE,则不返回行。n 必须是整数常量,@nvar 的数据类型必须为 smallint、tinyint 或 int。 GLOBAL 指定 cursor_name 是指全局游标。 cursor_name 要从中进行提取的打开的游标的名称。如果全局游标和局部游标都使用 cursor_name 作为它们的名称,那么指定 GLOBAL 时,cursor_name 指的是全局游标;未指定 GLOBAL 时,cursor_name 指的是局部游标。 @ cursor_variable_name 游标变量名,引用要从中进行提取操作的打开的游标。 INTO @variable_name[ ,…n] 允许将提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果集列的数据类型匹配,或是结果集列数据类型所支持的隐式转换。变量的数目必须与游标选择列表中的列数一致。   注释 如果 SCROLL 选项未在 ISO 样式的 DECLARE CURSOR 语句中指定,则 NEXT 是唯一支持的 FETCH 选项。如果在 ISO 样式的 DECLARE CURSOR 语句中指定了 SCROLL 选项,则支持所有 FETCH 选项。 如果使用 Transact-SQL DECLARE 游标扩展插件,则应用下列规则: 如果指定了 FORWARD_ONLY 或 FAST_FORWARD,则 NEXT 是唯一受支持的 FETCH 选项。 如果未指定 DYNAMIC、FORWARD_ONLY 或 FAST_FORWARD 选项,并且指定了 KEYSET、STATIC 或 SCROLL 中的某一个,则支持所有 FETCH […]

龙生   03 Feb 2016
View Details

SELECT INTO 和 INSERT INTO SELECT 两种表复制语句

Insert是T-sql中常用语句,Insert INTO table(field1,field2,…) values(value1,value2,…)这种形式的在应用程序开发中必不可少。但我们在开发、测试过程中,经常会遇到需要表复制的情况,如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECT INTO 和 INSERT INTO SELECT 表复制语句了。       1.INSERT INTO SELECT语句       语句形式为:Insert into Table2(field1,field2,…) select value1,value2,… from Table1       要求目标表Table2必须存在,由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。示例如下:    —1.创建测试表     create TABLE Table1     (         a varchar(10),         b varchar(10),         c varchar(10),         CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED         (             a ASC         )     ) ON [PRIMARY]     create TABLE Table2     (         a varchar(10),         c varchar(10),         d int,         CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED         (             a ASC         )     ) ON [PRIMARY]     GO     —2.创建测试数据     Insert into Table1 values('赵','asds','90')     Insert into Table1 values('钱','asds','100')     Insert into Table1 values('孙','asds','80')     Insert into Table1 values('李','asds',null)     GO     select * from Table2     —3.INSERT INTO SELECT语句复制表数据     Insert into Table2(a, c, d) select a,c,5 from Table1     GO     —4.显示更新后的结果     select * from Table2     GO     —5.删除测试表     drop TABLE Table1     drop TABLE Table2       2.SELECT INTO FROM语句       语句形式为:SELECT vale1, value2 into Table2 from Table1       要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。示例如下:    —1.创建测试表     create TABLE Table1     (         a varchar(10),         b varchar(10),         c varchar(10),         CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED         (             a ASC         )     ) ON [PRIMARY]     GO     —2.创建测试数据     Insert into Table1 values('赵','asds','90')     Insert into Table1 values('钱','asds','100')     Insert into Table1 values('孙','asds','80') […]

龙生   02 Feb 2016
View Details

sqlserver 自增ID插入指定数据

注意: 1.set identity_insert只对当前会话生效。 2.set identity_insert 表名 ON 设置后,必须显示指定Id,否则插入错误。如insert into table_name values('111')将报错。    向自增ID插入指定值。 报错:“当 IDENTITY_INSERT 设置为 OFF 时,不能为表 ' ' 中的标识列插入显式值”。    插入语句未显示指定ID。 报错:“仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表' '中的标识列指定显式值”。 from:http://www.cnblogs.com/wanghonghu/p/4093411.html

龙生   02 Feb 2016
View Details

Sql Server 常用系统存储过程大全

— 来源于网络 — 更详细的介结参考联机帮助文档 xp_cmdshell --*执行DOS各种命令,结果以文本行返回。 xp_fixeddrives --*查询各磁盘/分区可用空间 xp_loginconfig --*报告SQL Server 实例在Windows 上运行时的登录安全配置 xp_logininfo --*返回有关Windows 认证登录的信息。 xp_msver --*返回有关Microsoft SQL Server 的版本信息 xp_enumgroups    --返回Windows用户组列表或在指定域中的全局组列表。 xp_sendmail  --将电子邮件发送给指定的收件人(后续版本将删除该功能)。 xp_readmail --阅读SQL Mail收件箱中的邮件(后续版本将删除该功能)。 xp_deletemail --删除Microsoft SQL Server 收件箱中的邮件(后续版本将删除该功能)。 xp_startmail --通过该过程启动SQL Mail将返回两条消息,主要用于故障排除。 xp_stopmail --停止SQL 邮件客户端会话(后续版本将删除该功能)。 xp_grantlogin  --授予Windows 组或用户对SQL Server 的访问权限(后续版本将删除该功能)。 xp_revokelogin   --撤消Windows 组或用户对SQL Server 的访问权限(后续版本将删除该功能)。 xp_logevent --将用户定义消息记入SQL Server 日志文件和Windows 事件查看器。 xp_sprintf --设置一系列字符和值的格式并将其存储到字符串输出参数中。每个格式参数都用相应的参数替换。 xp_sqlmaint --使用包含sqlmaint 开关的字符串调用sqlmaint 实用工具(后续版本将删除该功能)。 xp_sscanf      --将数据从字符串读入每个格式参数所指定的参数位置。   sp_ActiveDirectory_Obj --控制数据库在Windows活动目录中的注册。 sp_ActiveDirectory_SCP  --控制已连接实例的数据库在Windows活动目录中的注册。 sp_add_agent_parameter --将新参数及其值添加到代理配置文件中。 sp_add_agent_profile --为复制代理创建新的配置文件。 sp_add_alert --创建一个警报。 sp_add_category --将指定的作业、警报或操作员类别添加到服务器中。 sp_add_job --*添加由SQLServerAgent 服务执行的新作业。 sp_add_jobschedule --*创建作业计划。 sp_add_jobserver --在指定的服务器中,以指定的作业为目标。 sp_add_jobstep --*在作业中添加一个步骤(操作)。 sp_add_log_shipping_alert_job  --检查是否已在此服务器上创建了警报作业,无则创建。 sp_add_log_shipping_primary_database --设置日志传送配置(包括备份作业、本地监视记录及远程监视记录)的主数据库。 […]

龙生   06 Nov 2015
View Details

关于redis、memcached、mongoDB 的对比

从以下几个维度,对redis、memcached、mongoDB 做了对比,欢迎拍砖 1、性能 都比较高,性能对我们来说应该都不是瓶颈 总体来讲,TPS方面redis和memcached差不多,要大于mongodb 2、操作的便利性       memcached数据结构单一       redis丰富一些,数据操作方面,redis更好一些,较少的网络IO次数        mongodb支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富 3、内存空间的大小和数据量的大小        redis在2.0版本后增加了自己的VM特性,突破物理内存的限制;可以对key value设置过期时间(类似memcache)        memcached可以修改最大可用内存,采用LRU算法        mongoDB适合大数据量的存储,依赖操作系统VM做内存管理,吃内存也比较厉害,服务不要和别的服务在一起 4、可用性(单点问题) 对于单点问题,              redis,依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制,因性能和效率问题, 所以单点问题比较复杂;不支持自动sharding,需要依赖程序设定一致hash 机制。 一种替代方案是,不用redis本身的复制机制,采用自己做主动复制(多份存储),或者改成增量复制的方式(需要自己实现),一致性问题和性能的权衡              Memcached本身没有数据冗余机制,也没必要;对于故障预防,采用依赖成熟的hash或者环状的算法,解决单点故障引起的抖动问题。              mongoDB支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制。 5、可靠性(持久化) 对于数据持久化和数据恢复,          redis支持(快照、AOF):依赖快照进行持久化,aof增强了可靠性的同时,对性能有所影响           memcached不支持,通常用在做缓存,提升性能;           MongoDB从1.8版本开始采用binlog方式支持持久化的可靠性 6、数据一致性(事务支持)          Memcached 在并发场景下,用cas保证一致性         redis事务支持比较弱,只能保证事务中的每个操作连续执行         mongoDB不支持事务 7、数据分析          mongoDB内置了数据分析的功能(mapreduce),其他不支持 8、应用场景         redis:数据量较小的高性能操作和运算上         memcached:用于在动态系统中减少数据库负载,提升性能;做缓存,提高性能(适合读多写少,对于数据量比较大,可以采用sharding)         MongoDB:主要解决海量数据的访问效率问题 from:http://blog.csdn.net/yangbutao/article/details/7437290

龙生   23 Oct 2015
View Details

SQL Server2008附加数据库失败 错误号:5120

附加数据库时,显示错误,错误信息为

一种解决方法为,设置mdf文件所在文件夹的权限(有些资料说只设置mdf文件的权限就好,但我试了不管用),在文件夹上右击——属性——安全,如图所示:

选择组或用户名中的Authenticated Users,点击编辑修改权限,选中允许完全控制,确定即可。

另一种解决方法,查了资料说不要用sa账户登录,用windows身份验证登录就可以附加成功,但是我的正好相反,用windows身份验证登录不能成功,用sa账户登录就可以附加成功。(真是无比神奇呀~~如果有大牛知道为啥麻烦告知一下,不胜感激呀)

from:http://blog.163.com/zhang_ying112/blog/static/19826008020128308257856/

通C#访问MongoDB数据

开始: 先下载个C#的驱动。MongoDB提供各种主流与非主流预言的开发驱动。 C# Driver 下载地址:猛击这里 CSharp Driver Tutorial:猛击这里 下载文件安装或者解压缩包 如果您是安装,请到安装位置寻找,如果是ZIP压缩包,解压缩包得到如下两个文件: MongoDB.Bson.dll              :序列化、Json相关 MongoDB.Driver.dll             :我们的驱动 没了,只有这两个文件是我们的最爱。   继续: 新建一个C#的项目,不管你是vs2008,还是vs2010,也许您手中有vs2012?也发给我一份吧。感谢共享:) 添加引用,将上面两个DLL引入到项目里面   您启动Mongod.exe了吗?启动服务。   代码里面添加命名空间: using MongoDB.Bson; using MongoDB.Driver; 跟着[CSharp Driver Tutorial:猛击这里]继续做。如果您没有打开[CSharp Driver Tutorial]就不要开了,看完全文再看,以免分散精力。 //  MongoDB连接串,以[mongodb: // ]开头。这里,我们连接的是本机的服务 string  connectionString  =   " mongodb://localhost " ; //  连接到一个MongoServer上 MongoServer server  =  MongoServer.Create(connectionString); MongoDb的连接串 在连接串中,我们可以指定其他机器上的服务和连接端口格式如下: mongodb://[username:password@]hostname[:port][/[database][?options]] 简单示例:mongodb://server1,server2:27017,server2:27018 更进一步详细的信息请查看[CSharp Driver Tutorial:猛击这里] MongoServer 有几种不同的重载了的创建方式: MongoServer Create()   如果只是连接本机,并且本机只启动了一个服务,直接调用这个方法,完全不需要连接串 MongoServer Create(MongoConnectionStringBuilder builder) MongoServer Create(MongoUrl url) MongoServer Create(string connectionString) MongoServer Create(Uri uri) 更进一步详细的信息请查看[CSharp Driver Tutorial:猛击这里] 继续: 再增加几行代码: //  MongoDB连接串,以[mongodb: // ]开头。这里,我们连接的是本机的服务 string  connectionString  =   " mongodb://localhost […]

龙生   05 Apr 2015
View Details

关于Mongodb启动服务时1067错误的解决方法

如图:按照官网Install MongoDB on Windows(参考文尾备注)章节介绍安装完服务之后,无论是命令行net start mongodb,还是在系统服务中启动MongoDB服务,都会提示1067的错误。 网上有些说删除Mongodb数据库目录下的mongod.lock文件之后可以正常重启服务,但是笔者试了之后还是不行,也觉得删除这类文件是治标不治本或者不安全的。 仔细看了下上面链接中的文档,因为我并未按照默认的C:\路径安装Mongodb,以及在C:\下面md data文件存放数据库,而是放在了D:\MongoDB(程序目录),以及D:\DB_MongoDB(数据库目录),初步觉得问题就出在这个问题之上。         如图,在mongod.cfg文件中指定了dbpath,再启动服务,就正常了。 (不止dbpath,其它必要的配置不正确或者不完全也可能导致1067服务启动失败的情况。) 备注: 官方安装Mongodb的Windows服务说明可能在更新,一般可按照以下方法直接安装Windows服务: ? 1 D:\Program Files\MongoDB 2.6 Standard\bin>mongod --install --serviceName MongoDB --serviceDisplayName MongoDB --logpath D:\Program Files\MongoDB 2.6 Standard\log\MongoDB.Log --dbpath D:\Program Files\MongoDB 2.6 Standard\db --directoryperdb 需要注意的是,log与db目录都要事先创建。   from:http://my.oschina.net/iuranus/blog/176258

龙生   04 Apr 2015
View Details

Mongodb 安装 以及 问题解决

一,下载 1.官网为:http://www.mongodb.org/ ;下载安装程序的地址为:http://www.mongodb.org/downloads ,选择选择的是Windows 32-bit 2.4.0版本。 2.下载MongoDB For .net 驱动开发包,官方的c#driver位于driver菜单下,地址为:https://github.com/mongodb/mongo-csharp-driver/downloads。这里还了解到有samus驱动下载地址:https://github.com/samus/mongodb-csharp 二,安装 1.将mongodb-win32-i386-2.4.0.zip解压到目录E:\mongodb-2.4.0,也就是把Bin目录放在该文件夹下。 2.在E:\mongodb-2.4.0创建Data文件夹,然后在该目录下分别创建db,log两个文件夹,至此E:\mongodb-2.4.0文件目录下有三个文件夹(bin,data,log). 3.在log文件夹下创建一个日志文件log.log,即完全目录为:E:\mongodb-2.4.0\log\log.log. 4. 程序启动方式 进入bin目录,在目录上输入cmd ,回车 弹出CMD窗口 mongod -dbpath "E:\mongodb-2.4.0\data\db" 执行此命令即将mongodb的数据库文件创建到C:\Program Files\mongodb\data\db 目录。 接着将Mongodb安装成windows服务 mongod --logpath "E:\mongodb-2.4.0\log\log.log"  --logappend --dbpath "E:\mongodb-2.4.0\data\db" --directoryperdb --install 测试数据库操作 在bin目录打开 mongo.exe   >help (查看相关信息) >db.foo.insert({test:100}) (往foo表插入test,100字段值,foo表为默认表) >db.foo.find() (查看foo表数据) 结果如下: 可以看到插入了2条记录分别人set,test 其它命令可查阅help命令或官网说明。               遇到的问题解决 ——————————————-- 1. 首先,当然是下载 MongoDB MongoDB的官方网站是:http://www.mongodb.org/, 最新版本下载在:http://www.mongodb.org/downloads 。请注意下载适合自己系统的安装包,我选择的是:Windows 64-bit 2008 R2+。 下载后的文件名称是:mongodb-win32-x86_64-2008plus-ssl-3.0.1-signed.msi ,点击安装。   根据官方文档:http://docs.mongodb.org/manual/tutorial/install-mongodb-on-windows/ Starting in version 2.2, MongoDB does not support Windows XP. Please use a more recent version of Windows to use more recent releases of MongoDB. 大意是:从版本2.2开始,MongoDB不支持Windows XP。请用较新版本的Windows来使用MongoDB的最新版本。     2. 创建数据库文件的存放位置 […]

龙生   04 Apr 2015
View Details
1 10 11 12 20