文章标签 ‘SQL’
[转载]SQL截取字符串(substring与patindex的使用) – 爱与决择 – 博客园. 首先学习两个函数 1.substring 返回字符、binary、text 或 image 表达式的一部分。 基本语法:SUBSTRING ( expression , start , length ) expression:字符串、二进制字符串、text、image、列或包含列的表达式 start:整数,指定子串的开始位置 注:SQL中”1″表示字符串中的第一个字符,而.NET中”0″表示第一个字符 length:整数,指定子串的长度(要返回的字符数或字节数) 2.patindex 返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。 基本语法:PATINDEX ( ‘%pattern%‘ , expression ) pattern:字符串。可以使用通配符,但 pattern 之前和之后必须有 % 字符(搜索第一个和最后一个字符时除外)。pattern 是短字符数据类型类别的表达式 expression:表达式,通常为要在其中搜索指定模式的列,expression 为字符串数据类型类别 下面结合上面的两个函数,截取字符串中指定的字符 declare @a varchar(50) set @a=‘2009年7月15日星期五‘ select substring(@a,1,4) –获取年份2009 declare @b int set @b=patindex(‘%日%‘,@a) –获取’日’这个字符在字符串中的位置,即10 select substring(@a,6,@b-5) [...]
[转载]T-SQL查询进阶–理解SQL SERVER中的分区表 – CareySon – 博客园. 简介 分区表是在SQL SERVER2005之后的版本引入的特性。这个特性允许把逻辑上的一个表在物理上分为很多部分。而对于SQL SERVER2005之前版本,所谓的分区表仅仅是分布式视图,也就是多个表做union操作. 分区表在逻辑上是一个表,而物理上是多个表.这意味着从用户的角度来看,分区表和普通表是一样的。这个概念可以简单如下图所示: 而对于SQL SERVER2005之前的版本,是没有分区这个概念的,所谓的分区仅仅是分布式视图: 本篇文章所讲述的分区表指的是SQL SERVER2005之后引入的分区表特性. 为什么要对表进行分区 在回答标题的问题之前,需要说明的是,表分区这个特性只有在企业版或者开发版中才有,还有理解表分区的概念还需要理解SQL SERVER中文件和文件组的概念. 对表进行分区在多种场景下都需要被用到.通常来说,使用表分区最主要是用于: 存档,比如将销售记录中1年前的数据分到一个专门存档的服务器中 便于管理,比如把一个大表分成若干个小表,则备份和恢复的时候不再需要备份整个表,可以单独备份分区 提高可用性,当一个分区跪了以后,只有一个分区不可用,其它分区不受影响 提高性能,这个往往是大多数人分区的目的,把一个表分布到不同的硬盘或其他存储介质中,会大大提升查询的速度. 分区表的步骤 分区表的定义大体上分为三个步骤: 定义分区函数 定义分区构架 定义分区表 分区函数,分区构架和分区表的关系如下: 分区表依赖分区构架,而分区构架又依赖分区函数.值得注意的是,分区函数并不属于具体的分区构架和分区表,他们之间的关系仅仅是使用关系. 下面我们通过一个例子来看如何定义一个分区表: 假设我们需要定义的分区表结构如下: 第一列为自增列,orderid为订单id列,SalesDate为订单日期列,也就是我们需要分区的依据. 下面我们按照上面所说的三个步骤来实现分区表. 定义分区函数 分区函数是用于判定数据行该属于哪个分区,通过分区函数中设置边界值来使得根据行中特定列的值来确定其分区,上面例子中,我们可以通过SalesDate 的值来判定其不同的分区.假设我们想定义两个边界值(boundaryValue)进行分区,则会生成三个分区,这里我设置边界值分别为 2004-01-01和2007-01-01,则前面例子中的表会根据这两个边界值分成三个区: 在MSDN中,定义分区函数的原型如下: CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type ) AS RANGE [ LEFT | RIGHT ] FOR VALUES [...]
[转载]SQL模糊查询语句和Escape转义字符 – amylis – 博客园. 通配符 描述 示例 % 包含零个或更多字符的任意字符串。 WHERE title LIKE ‘%computer%’ 将查找处于书名任意位置的包含单词 computer 的所有书名。 _(下划线) 任何单个字符。 WHERE au_fname LIKE ‘_ean’ 将查找以 ean 结尾的所有 4 个字母的名字(Dean、Sean 等)。 [ ] 指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符。 WHERE au_lname LIKE ‘[C-P]arsen’ 将查找以arsen 结尾且以介于 C 与 P 之间的任何单个字符开始的作者姓氏,例如,Carsen、Larsen、Karsen 等。 [^] 不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符。 WHERE au_lname [...]
[转载]T-SQL查询进阶–详解公用表表达式(CTE) – CareySon – 博客园. 简介 对于SELECT查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可读,在一个查询中引用另外的结果集都是通过视图而不是子查询来进行分解的. 但是,视图是作为系统对象存在数据库中,那对于结果集仅仅需要在存储过程或是用户自定义函数中使用一次的时候,使用视图就显得有些奢侈了. 公用表表达式(Common Table Expression)是SQL SERVER 2005版本之后引入的一个特性.CTE可以看作是一个临时的结果集,可以在接下来的一个 SELECT,INSERT,UPDATE,DELETE,MERGE语句中被多次引用。使用公用表达式可以让语句更加清晰简练. 除此之外,根据微软对CTE好处的描述,可以归结为四点: 可以定义递归公用表表达式(CTE) 当不需要将结果集作为视图被多个地方引用时,CTE可以使其更加简洁 GROUP BY语句可以直接作用于子查询所得的标量列 可以在一个语句中多次引用公用表表达式(CTE) 公用表表达式(CTE)的定义 公用表达式的定义非常简单,只包含三部分: 公用表表达式的名字(在WITH之后) 所涉及的列名(可选) 一个SELECT语句(紧跟AS之后) 在MSDN中的原型: WITH expression_name [ ( column_name [,...n] ) ] AS ( CTE_query_definition ) 按照是否递归,可以将公用表(CTE)表达式分为递归公用表表达式和非递归公用表表达式. 非递归公用表表达式(CTE) 非递归公用表表达式(CTE)是查询结果仅仅一次性返回一个结果集用于外部查询调用。并不在其定义的语句中调用其自身的CTE 非递归公用表表达式(CTE)的使用方式和视图以及子查询一致 比如一个简单的非递归公用表表达式: 当然,公用表表达式的好处之一是可以在接下来一条语句中多次引用: 前面我一直强调“在接下来的一条语句中”,意味着只能接下来一条使用: 由于CTE只能在接下来一条语句中使用,因此,当需要接下来的一条语句中引用多个CTE时,可以定义多个,中间用逗号分隔: 递归公用表表达式(CTE) 递归公用表表达式很像派生表(Derived Tables ),指的是在CTE内的语句中调用其自身的CTE.与派生表不同的是,CTE可以在一次定义多次进行派生递归.对于递归的概念,是指一个函数或是过程直接或者间接的调用其自身,递归的简单概念图如下: 递归在C语言中实现的一个典型例子是斐波那契数列: long fib(int n) [...]
[转载]SQL 将一个字段内用逗号分隔的内容分成多条记录 – 岩子 – 博客园. 由于业务需求,我们可能会把一串以分割符字符串数据放到一个字段,如我们在客户端处理拆分是很简单的,不过这样做效果不太好,怎么用SQL SERVER 2008 来解决这件事件哪? 方案1 用SQL SERVER XML 功能来解决 —-> 生成测试数据: @T DECLARE @T TABLE (id INT,Col1 VARCHAR(50),Col2 VARCHAR(50)) INSERT INTO @T SELECT 1,’卸货费’,'运输车队业务, 客服接单业务’ UNION ALL SELECT 2,’报关费’,'报关业务、客服接单业务’ —-SQL查询如下: SELECT T.id, A.x.value(‘.’,'varchar(10)’) AS code, B.x.value(‘.’,'varchar(10)’) AS code2 FROM ( SELECT *,doc = CONVERT(xml,”+REPLACE(code,’,',”)+”), doc2=CONVERT(xml,”+REPLACE(code2,’,',”)+”) FROM @T ) AS [...]

