随笔分类 - SQL
摘要:数据库文件每个 SQL Server 数据库至少具有两个操作系统文件:一个数据文件和一个日志文件。数据文件包含数据和对象,例如表、索引、存储过程和视图。日志文件包含恢复数据库中的所有事务所需的信息。为了便于分配和管理,可以将数据文件集合起来,放到文件组中。SQL Server 数据库具有三种类型的文件,如下表所示:文件的页和区在 SQL Server 中,页的大小为 8 KB。这意味着 SQL Server 数据库中每 MB 有 128 页。SQL Server 数据文件中的页按顺序编号,文件的首页以 0 开始。数据库中的每个文件都有一个唯一的文件 ID 号。若要唯一标识数据库中的页,需要同时
阅读全文
摘要:特定的分区可以在下列情况中,视图被视为可更新的分区视图: 视图是一组 SELECT 语句,这些语句的结果集通过 UNION ALL 语句组合为一个结果集。每个 SELECT 语句引用一个 SQL Server 基表。该表可以是本地表,也可以是使用 4 部分名称、OPENROWSET 函数或 OPENDATASOURCE 函数引用的链接表(不能使用 OPENDATASOURCE 或 OPENROWSET 函数指定直接传递式查询)。 INSERT 语句通过分区视图将数据添加到成员表中。INSERT 语句必须遵守下列规则: 所有列必须包含在 INSERT 语句中,即使基表中的列可能为 NULL 或.
阅读全文
摘要:今天有个朋友很着急地打电话给我,他用delete语句误删除了SQL Server 2008数据库中两个表中的所有记录,而这个数据库之前没有任何备份。让我帮他解决一下,不然他要赔偿客户很多钱。SQL Server中误删除数据的恢复本来不是件难事,从事务日志恢复即可。但是,这个恢复需要有两个前提条件:1. 至少有一个误删除之前的数据库完全备份。2. 数据库的恢复模式(Recovery mode)是“完整(Full)”。针对这两个前提条件,会有三种情况:情况一、如果这两个前提条件都存在,通过SQL语句只需三步就能恢复(参考文章),无需借助第三方工具。 a) 备份当前数据库的事务日志:BACKUP .
阅读全文
摘要:一个数据表(t_tree):表中的数据有三个字段:id、node_name、parent_id。实际上,这个表中保存了一个树型结构,分三层:省、市、区。其中id表示当前省、市或区的id号、node_name表示名称、parent_id表示节点的父节点的id。 现在有一个需求,要查询出某个省下面的所有市和区(查询结果包含省)。如果只使用SQL语句来实现,需要使用到游标、临时表等技术。但在SQL Server2005中还可以使用CTE来实现。 从这个需求来看属于递归调用,也就是说先查出满足调价的省的记录,在本例子中的要查“辽宁省”的记录,如下: id node_name parent_i...
阅读全文
摘要:一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。 特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将WITH AS短语所获取的数据放入一个TEMP表里,如果只是被调用.
阅读全文
摘要:1、判断数据表是否存在 方法一:use yourdb;goif object_id(N'tablename',N'U') is not nullprint '存在'else print '不存在'例如:use fireweb;goif object_id(N'TEMP_TBL',N'U') is not nullprint '存在'else print '不存在'方法二:USE [实例名] GO IF EXISTS (SELECT * FROM dbo.SysObje
阅读全文
摘要:@check约束例:创建Users,要求电子邮件必须包括“@”解:create table users(uid int primary key ,uname char(32),ueamil char(32)Usex bit ,check (ueamil char(32) like ‘%@%’))@默认约束例:要求性别默认为1 ,性别不能为空解:create table users(uid int primary key ,uname char(32),ueamil char(32)Usex bit default ‘1’not null ,check (ueamil char(32) like
阅读全文
摘要:CREATEFUNCTIONdbo.SplitString(@ExpressionNVARCHAR(4000),--要拆分的字符串@DelimiterNVARCHAR(100),--拆分符号@nINT--要得到已拆分的返回字符串位置)RETURNSNVARCHAR(4000)ASBEGINDECLARE@pINTSET@p=CharIndex(@Delimiter,@Expression)IF@p>0BEGINSET@p=@p+Len(@Delimiter)-1ENDDECLARE@iINTSET@i=1WHILE@i<@nBEGINSET@i=@i+1SET@Expression
阅读全文
摘要:MS SQL Server2005存储过程、游标、游标嵌套综合例子: 放在这里备忘》》》Java代码 createprocdecisionPathRefSchemesasbeginDECLARE@pathIdvarchar(64)DECLARE@schemeIdvarchar(64)DECLARE@flagintegerDECLARE@seqintegerDECLAREmycursorcursorforselectidfromimps_pd_decision_pathwheresurfaceType='沥青路面'androadGrade='高速、一级、二级'DE
阅读全文
摘要:这是计算一个月第一天的SQL 脚本: SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) --当月的第一天SELECT DATEADD(mm, DATEDIFF(mm,0,getdate())-1, 0) --上个月的第一天SELECT DATEADD(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) --当月的最后一天SELECT DATEADD(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate()), 0)) --上个月的最后一天我们把这个语句分开来看看它是如何工作的。.
阅读全文
摘要:SQL Server 2005合并列成字符串 2008-11-07如果要将数据中的某一列合并成字符串,形成 A,B,C 这样的格式的话,一般性代码如下DECLARE @str nvarchar(4000)SELECT @str = @str + Description + ',' FROM tableWHERE 1 = 1但,如果Description有相同的行,但又想过滤掉,绝对不可以写成SELECT DISTINCT @str = @str + Description + ',' FROM tableWHERE 1 = 1这样只会取到最后一行的数据,而应该写
阅读全文
摘要:是游标里面嵌套游标吗?数据量大的话最好不要采用这种方法!这是SQL SERVER的:DECLARE CUR_1 CURSOR--第一层游标声明FOR SELECT C_1,C_2 FROM TABLENAMEOPEN CUR_1FETCH NEXT FROM CUR_1 INTO @C_1,@C_2WHILE @@FETCH_STATUES<>0BEGIN DECLARE CUR_2 CURSOR--第二层游标声明 FOR SELECT A_1,A_2 FROM TABLENAME OPEN CUR_2 FETCH NEXT FROM CUR_2 INTO @C_1,@C_2 WH
阅读全文
摘要:select year(日期字段),month(日期字段),day(日期字段)from 表
阅读全文
摘要:在.Net1.1中无论是对于批量插入整个DataTable中的所有数据到数据库中,还是进行不同数据源之间的迁移,都不是很方便。而 在.Net2.0中,SQLClient命名空间下增加了几个新类帮助我们通过DataTable或DataReader批量迁移数据。数据源可以来自关 系数据库或者XML文件,甚至WebService返回结果。其中最重要的一个类就是SqlBulkCopy类,使用它可以很方便的帮助我们把数据源的数 据迁移到目标数据库中。下面我们先通过一个简单的例子说明这个类的使用:首先:web.config<connectionStrings><addname="
阅读全文
摘要:/// <summary> /// 判断是否存在某表的某个字段 /// </summary> /// <param name="tableName">表名称</param> /// <param name="columnName">列名称</param> /// <returns>是否存在</returns> public static bool ColumnExists(string tableName, string columnName) { strin
阅读全文
摘要:SQL Server 2005“备份集中的数据库备份与现有的数据库不同”解决方法以前一直使用SQL Server2000,现在使用SQL Server2005,就在现在的项目中使用它了。 对于SQL Server 2005,有几个地方是要注意的,比如在还原数据库时,不像2000里边将数据库和文件区分的很细,统一均为文件,这就使还原的数据库文件制定为. bak。那么想还原2000的数据库(备份数据库文件,无后缀名的),就需要自己手工选择。数据库的备份到这里是没有任何的问题的,可能大家也都说这完全没有问题呀,跟我原来的做法一摸一样呀,怎么到了后面就不对了呢?各位不要着急,只要慢慢的往后看就知道了,
阅读全文
摘要:如何把问题:假设有张学生成绩表(tb)如下:姓名 课程 分数张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 物理 94转换后成为姓名 分数张三 74,83,93李四 74,84,94======================================================SELECT XM,FENSHU=STUFF((SELECT ','+CONVERT(VARCHAR,FENSHU) FROM TB WHERE XM=A.XM FOR XML PATH('')),1,1,'')FROM T
阅读全文
摘要:SqlServer日期(convert函数,getdate函数)函数GETDATE()的返回值在显示时只显示到秒。实际上,SQL Sever内部时间可以精确到毫秒级(确切地说,可以精确到3.33毫秒)。 ..类型0,9,和13总是返回四位的年。对其它类型,要显示世纪,把style值加上100。类型13和14返回24小时时钟的时间。类型0,7,和 13返回的月份用三位字符表示(用Nov代表November).对表11.1中所列的每一种格式,你可以把类型值加上100来显示有世纪的年(例如,00年将显示为2000年)。例如,要按日本标准显示日期,包括世纪,你应使用如下的语句:SELECT CONVE
阅读全文
摘要:SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之间2009年10月10日 星期六 17:11错误提示:“SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之间。” 出现场景:用ASP.NET制作某商业网站的注册功能时,调用写好的存储过程出错原因:传给数据库(在这里我是传给存储过程)的时间类型的值为NULL这里的NULL指的是程序代码里面的null,大多数出现这种情况的情景是:在程序里面定义了一个时间类型的变量,没有给赋值,就传给数据
阅读全文