`
zben000
  • 浏览: 41753 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

SqlServer 函数 大全

阅读更多
SqlServer 函数 大全
sql server使用convert来取得datetime日期数据
sql server使用convert来取得datetime日期数据,以下实例包含各种日期格式的转换
语句及查询结果:
Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM
Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06
Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16
Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06
Select CONVERT(varchar(100), GETDATE(), 4): 16.05.06
Select CONVERT(varchar(100), GETDATE(), 5): 16-05-06
Select CONVERT(varchar(100), GETDATE(), 6): 16 05 06
Select CONVERT(varchar(100), GETDATE(), 7): 05 16, 06
Select CONVERT(varchar(100), GETDATE(),: 10:57:46
Select CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM
Select CONVERT(varchar(100), GETDATE(), 10): 05-16-06
Select CONVERT(varchar(100), GETDATE(), 11): 06/05/16
Select CONVERT(varchar(100), GETDATE(), 12): 060516
Select CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937
Select CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967
Select CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47
Select CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157
Select CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM
Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16
Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47
Select CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250
Select CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM
Select CONVERT(varchar(100), GETDATE(), 101): 05/16/2006
Select CONVERT(varchar(100), GETDATE(), 102): 2006.05.16
Select CONVERT(varchar(100), GETDATE(), 103): 16/05/2006
Select CONVERT(varchar(100), GETDATE(), 104): 16.05.2006
Select CONVERT(varchar(100), GETDATE(), 105): 16-05-2006
Select CONVERT(varchar(100), GETDATE(), 106): 16 05 2006
Select CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006
Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49
Select CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM
Select CONVERT(varchar(100), GETDATE(), 110): 05-16-2006
Select CONVERT(varchar(100), GETDATE(), 111): 2006/05/16
Select CONVERT(varchar(100), GETDATE(), 112): 20060516
Select CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513
Select CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547
Select CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49
Select CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49.700
Select CONVERT(varchar(100), GETDATE(), 126): 2006-05-16T10:57:49.827
Select CONVERT(varchar(100), GETDATE(), 130): 18 ???? ?????? 1427 10:57:49:907AM
Select CONVERT(varchar(100), GETDATE(), 131): 18/04/1427 10:57:49:920AM

说明:
使用 CONVERT:

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

参数
expression

是任何有效的 Microsoft? SQL Server? 表达式。。

data_type

目标系统所提供的数据类型,包括 bigint 和 sql_variant。不能使用用户定义的数据类型。
length

nchar、nvarchar、char、varchar、binary 或 varbinary 数据类型的可选参数。

style

日期格式样式,借以将 datetime 或 smalldatetime 数据转换为字符数据(nchar、nvarchar、char、

varchar、nchar 或 nvarchar 数据类型);或者字符串格式样式,借以将 float、real、money 或

smallmoney 数据转换为字符数据(nchar、nvarchar、char、varchar、nchar 或 nvarchar 数据类型)。

SQL Server 支持使用科威特算法的阿拉伯样式中的数据格式。

在表中,左侧的两列表示将 datetime 或 smalldatetime 转换为字符数据的 style 值。给 style 值加 100

,可获得包括世纪数位的四位年份 (yyyy)。

不带世纪数位 (yy) 带世纪数位 (yyyy)
标准
输入/输出**
- 0 或 100 (*) 默认值 mon dd yyyy hh:miAM(或 PM)
1 101 美国 mm/dd/yyyy
2 102 ANSI yy.mm.dd
3 103 英国/法国 dd/mm/yy
4 104 德国 dd.mm.yy
5 105 意大利 dd-mm-yy
6 106 - dd mon yy
7 107 - mon dd, yy
8 108 - hh:mm:ss
- 9 或 109 (*) 默认值 + 毫秒 mon dd yyyy hh:mi:ss:mmmAM(或 PM)
10 110 美国 mm-dd-yy
11 111 日本 yy/mm/dd
12 112 ISO yymmdd
- 13 或 113 (*) 欧洲默认值 + 毫秒 dd mon yyyy hh:mm:ss:mmm(24h)
14 114 - hh:mi:ss:mmm(24h)
- 20 或 120 (*) ODBC 规范 yyyy-mm-dd hh:mm:ss[.fff]
- 21 或 121 (*) ODBC 规范(带毫秒) yyyy-mm-dd hh:mm:ss[.fff]
- 126(***) ISO8601 yyyy-mm-dd Thh:mm:ss.mmm(不含空格)
- 130* Hijri**** dd mon yyyy hh:mi:ss:mmmAM
- 131* Hijri**** dd/mm/yy hh:mi:ss:mmmAM

* 默认值(style 0 或 100、9 或 109、13 或 113、20 或 120、21 或 121)始终返回世纪数位 (yyyy)。
** 当转换为 datetime时输入;当转换为字符数据时输出。
*** 专门用于 XML。对于从 datetime或 smalldatetime 到 character 数据的转换,输出格式如表中所示。

对于从 float、money 或 smallmoney 到 character 数据的转换,输出等同于 style 2。对于从 real 到

character 数据的转换,输出等同于 style 1。
****Hijri 是具有几种变化形式的日历系统,Microsoft? SQL Server? 2000 使用其中的科威特算法。

重要 默认情况下,SQL Server 根据截止年份 2049 解释两位数字的年份。即,两位数字的年份 49 被解释为

2049,而两位数字的年份 50 被解释为 1950。许多客户端应用程序(例如那些基于 OLE 自动化对象的客户端

应用程序)都使用 2030 作为截止年份。SQL Server 提供一个配置选项("两位数字的截止年份"),借以更

改 SQL Server 所使用的截止年份并对日期进行一致性处理。然而最安全的办法是指定四位数字年份。

当从 smalldatetime 转换为字符数据时,包含秒或毫秒的样式将在这些位置上显示零。当从 datetime 或

smalldatetime 值进行转换时,可以通过使用适当的 char 或 varchar 数据类型长度来截断不需要的日期部



SQL2005一个不起眼但很实用的函数
http://tech.ddvip.com   2008年09月24日    社区交流

关键字: DataGuard checkpoint 动态查询 synonyms 卸载SQL 2005 SQL Server群集
本文详细介绍SQL2005一个不起眼但很实用的函数
COALESCE

返回其参数中的第一个非空表达式,当你要在n个字段中选取某一个非空值可以用它,比如下面语句

select Coalesce(null,null,1,2,null)union
select Coalesce(null,11,12,13,null)union
select Coalesce(111,112,113,114,null)

/*---返回结果-----

1
11
111

-----------------*/

而与他等价的case when嵌套需要一大堆代码




SQL Server字符串处理函数大全
所属类别:SQL SERVER
推荐指数:★★★☆
文档人气:9055
本周人气:127
发布日期:2008-2-18
select 字段1 from 表1 where 字段1.IndexOf("云")=1;
这条语句不对的原因是indexof()函数不是sql函数,改成sql对应的函数就可以了。
left()是sql函数。
select 字段1 from 表1 where charindex('云',字段1)=1; 字符串函数对二进制数据、字符串和表达式执

行不同的运算。此类函数作用于CHAR、VARCHAR、 BINARY、 和VARBINARY 数据类型以及可以隐式转换为CHAR

或VARCHAR的数据类型。可以在SELECT 语句的SELECT 和WHERE 子句以及表达式中使用字符串函数。
常用的字符串函数有:

一、字符转换函数
1、ASCII()
返回字符表达式最左端字符的ASCII 码值。在ASCII()函数中,纯数字的字符串可不用‘’括起来,但含其

它字符的字符串必须用‘’括起来使用,否则会出错。
2、CHAR()
将ASCII 码转换为字符。如果没有输入0 ~ 255 之间的ASCII 码值,CHAR() 返回NULL 。
3、LOWER()和UPPER()
LOWER()将字符串全部转为小写;UPPER()将字符串全部转为大写。
4、STR()
把数值型数据转换为字符型数据。
STR (<float_expression>[,length[, <decimal>]])
length 指定返回的字符串的长度,decimal 指定返回的小数位数。如果没有指定长度,缺省的length 值为10

, decimal 缺省值为0。
当length 或者decimal 为负值时,返回NULL;
当length 小于小数点左边(包括符号位)的位数时,返回length 个*;
先服从length ,再取decimal ;
当返回的字符串位数小于length ,左边补足空格。
二、去空格函数
1、LTRIM() 把字符串头部的空格去掉。

2、RTRIM() 把字符串尾部的空格去掉。

三、取子串函数
1、left()
LEFT (<character_expression>, <integer_expression>)
返回character_expression 左起 integer_expression 个字符。

2、RIGHT()
RIGHT (<character_expression>, <integer_expression>)
返回character_expression 右起 integer_expression 个字符。

3、SUBSTRING()
SUBSTRING (<expression>, <starting_ position>, length)
返回从字符串左边第starting_ position 个字符起length个字符的部分。

四、字符串比较函数
1、CHARINDEX()
返回字符串中某个指定的子串出现的开始位置。
CHARINDEX (<’substring_expression’>, <expression>)
其中substring _expression 是所要查找的字符表达式,expression 可为字符串也可为列名表达式。如果没

有发现子串,则返回0 值。
此函数不能用于TEXT 和IMAGE 数据类型。
2、PATINDEX()
返回字符串中某个指定的子串出现的开始位置。
PATINDEX (<’%substring _expression%’>, <column_ name>)其中子串表达式前后必须有百分号“%”否则

返回值为0。
与CHARINDEX 函数不同的是,PATINDEX函数的子串中可以使用通配符,且此函数可用于CHAR、 VARCHAR 和

TEXT 数据类型。

五、字符串操作函数
1、QUOTENAME()
返回被特定字符括起来的字符串。
QUOTENAME (<’character_expression’>[, quote_ character]) 其中quote_ character 标明括字符串所

用的字符,缺省值为“[]”。
2、REPLICATE()
返回一个重复character_expression 指定次数的字符串。
REPLICATE (character_expression integer_expression) 如果integer_expression 值为负值,则返回NULL



3、REVERSE()
将指定的字符串的字符排列顺序颠倒。
REVERSE (<character_expression>) 其中character_expression 可以是字符串、常数或一个列的值。

4、REPLACE()
返回被替换了指定子串的字符串。
REPLACE (<string_expression1>, <string_expression2>, <string_expression3>) 用

string_expression3 替换在string_expression1 中的子串string_expression2。

4、SPACE()
返回一个有指定长度的空白字符串。
SPACE (<integer_expression>) 如果integer_expression 值为负值,则返回NULL 。

5、STUFF()
用另一子串替换字符串指定位置、长度的子串。
STUFF (<character_expression1>, <start_ position>, <length>,<character_expression2>)
如果起始位置为负或长度值为负,或者起始位置大于character_expression1 的长度,则返回NULL 值。
如果length 长度大于character_expression1 中 start_ position 以右的长度,则character_expression1

只保留首字符。
六、数据类型转换函数
1、CAST()
CAST (<expression> AS <data_ type>[ length ])

2、CONVERT()
CONVERT (<data_ type>[ length ], <expression> [, style])

1)data_type为SQL Server系统定义的数据类型,用户自定义的数据类型不能在此使用。
2)length用于指定数据的长度,缺省值为30。
3)把CHAR或VARCHAR类型转换为诸如INT或SAMLLINT这样的INTEGER类型、结果必须是带正号或负号的数值。
4)TEXT类型到CHAR或VARCHAR类型转换最多为8000个字符,即CHAR或VARCHAR数据类型是最大长度。
5)IMAGE类型存储的数据转换到BINARY或VARBINARY类型,最多为8000个字符。
6)把整数值转换为MONEY或SMALLMONEY类型,按定义的国家的货币单位来处理,如人民币、美元、英镑等。
7)BIT类型的转换把非零值转换为1,并仍以BIT类型存储。
8)试图转换到不同长度的数据类型,会截短转换值并在转换值后显示“+”,以标识发生了这种截断。
9)用CONVERT()函数的style 选项能以不同的格式显示日期和时间。style 是将DATATIME 和SMALLDATETIME

数据转换为字符串时所选用的由SQL Server 系统提供的转换样式编号,不同的样式编号有不同的输出格式。
七、日期函数
1、day(date_expression)
返回date_expression中的日期值

2、month(date_expression)
返回date_expression中的月份值

3、year(date_expression)
返回date_expression中的年份值

4、DATEADD()
DATEADD (<datepart>, <number>, <date>)
返回指定日期date 加上指定的额外日期间隔number 产生的新日期。
5、DATEDIFF()
DATEDIFF (<datepart>, <date1>, <date2>)
返回两个指定日期在datepart 方面的不同之处,即date2 超过date1的差距值,其结果值是一个带有正负号的

整数值。

6、DATENAME()
DATENAME (<datepart>, <date>)
以字符串的形式返回日期的指定部分此部分。由datepart 来指定。

7、DATEPART()
DATEPART (<datepart>, <date>)
以整数值的形式返回日期的指定部分。此部分由datepart 来指定。
DATEPART (dd, date) 等同于DAY (date)
DATEPART (mm, date) 等同于MONTH (date)
DATEPART (yy, date) 等同于YEAR (date)

8、GETDATE()
以DATETIME 的缺省格式返回系统当前的日期和时间。

SQL Server函数大全 收藏
--聚合函数
use pubs
go
select avg(distinct price)  --算平均数
from titles
where type='business'
go
use pubs
go
select max(ytd_sales)  --最大数
from titles
go

use pubs
go
select min(ytd_sales) --最小数
from titles
go

use pubs
go
select type,sum(price),sum(advance)  --求和
from titles
group by type
order by type
go

use pubs
go
select count(distinct city)  --求个数
from authors
go

use pubs
go
select stdev(royalty) --返回给定表达式中所有值的统计标准偏差
from titles
go

use pubs
go
select stdevp(royalty) --返回表达式中所有制的填充统计标准偏差
from titles
go

use pubs
go
select var(royalty) --返回所有值的统计方差
from titles
go

use pubs
go
select varp(royalty) --返回所有值的填充的统计方差
from titles
go

--数学函数

select sin(23.45),atan(1.234),rand(),PI(),sign(-2.34) --其中rand是获得一个随机数
--配置函数
SELECT @@VERSION --获取当前数据库版本
SELECT @@LANGUAGE --当前语言
--时间函数
select getdate() as 'wawa_getdate' --当前时间
select getutcdate() as 'wawa_getutcdate' --获取utc时间
select day(getdate()) as 'wawa_day' --取出天
select month(getdate()) as 'wawa_month' --取出月
select year(getdate()) as 'wawa_year' --取出年
select dateadd(d,3,getdate()) as wawa_dateadd --加三天,注意'd'表示天,'m'表示月,'yy'表示年,下面一


select datediff(d,'2004-07-01','2004-07-15') as wawa_datediff --计算两个时间的差
select datename(d,'2004-07-15') as wawa_datename --取出时间的某一部分
select datepart(d,getdate()) as wawa_datepart  --取出时间的某一部分,和上面的那个差不多
--字符串函数
select ascii(123) as '123',ascii('123') as '"123"',ascii('abc') as '"abc"' --转换成ascii码
select char(123),char(321),char(-123) --根据ascii转换成字符
select lower('ABC'),lower('Abc'),upper('Abc'),upper('abc') --转换大小写
select str(123.45,6,1), str(123.45,2,2) --把数值转换成字符串
select ltrim('    "左边没有空格"')  --去空格
select rtrim('"右边没有空格"     ') --去空格
select ltrim(rtrim('   "左右都没有空格"    ')) --去空格
select left('sql server',3),right('sql server',6) --取左或者取右

use pubs
select au_lname,substring(au_fname,1,1) --取子串
from authors
order by au_lname

select charindex('123','abc123def',2) --返回字符串中指定表达式的起始位置
select patindex('123','abc123def'),patindex('%123%','abc123def') --返回表达式中某模式第一次出现

的起始位置
select quotename('abc','{'),quotename('abc') --返回由指定字符扩住的字符串
select reverse('abc'),reverse('上海') --颠倒字符串顺序
select replace('abcdefghicde','cde','xxxx') --返回呗替换了指定子串的字符串
select space(5),space(-2)

--系统函数
select host_name() as 'host_name',host_id() as 'host_id',user_name() as 'user_name',user_id() as

'user_id',db_name() as 'db_name'
--变量的定义使用
--声明局部变量
declare @mycounter int
declare @last_name varchar(30),@fname varchar(20),@state varchar(2) --一下声明多个变量
--给变量赋值
use northwind
go
declare @firstnamevariable varchar(20),
@regionvariable varchar(30)
set @firstnamevariable='anne' --可以用set,也可以用select给变量赋值,微软推荐用set,但select在选择

一个值直接赋值时很有用
set @regionvariable ='wa'

select lastname,firstname,title  --用声明并赋值过的变量构建一个Select语句并查询
from employees
where firstname= @firstnamevariable or region=@regionvariable
go
--全局变量
select @@version  --返回数据库版本
select @@error  --返回最后的一次脚本错误
select @@identity  --返回最后的一个自动增长列的id

--while,break,continue的使用
--首先计算所有数的平均价格,如果低于30的话进入循环让所有的price翻倍,
--里面又有个if来判断如果最大的单价还大于50的话,退出循环,否则继续循环,知道最大单价大于50就break出

循环,呵呵,
--我分析的应该对吧.
use pubs
go
while (select avg(price) from titles) <$30
begin
update titles
  set price=price*2
  select max(price) from titles
  if(select max(price) from titles) >$50
  break
  else
  continue
end
print 'too much for the marker to bear'

--事务编程经典例子
--begin transaction是开始事务,commit transaction是提交事务,rollback transaction是回滚事务
--这个例子是先插入一条记录,如果出现错误的话就回滚事务,也就是取消,并直接return(返回),如果没错的话

就commit 提交这个事务了哦
--上面的那个return返回可以返回一个整数值,如果这个值是0的话就是执行的时候没出错,如果出错了就是一

个负数,
--这个return也可以用在存储过程中,可用用 exec @return_status= pro_name来获取这个值
use pubs
go
begin tran mytran
insert into stores(stor_id,stor_name)
  values('333','my books')
go
insert into discounts(discounttype,stor_id,discount)
  values('清仓甩卖','9999',50.00)
if @@error<>0
  begin
   rollback tran mytran
   print '插入打折记录出错'
   return
  end
commit tran mytran

--事务处理的保存点示例
--做了事务保存点后可以rollback(回滚)到指定的保存点,不至于所有的操作都不能用
use pubs
go
select * from stores
begin transaction testsavetran
insert into stores(stor_id,stor_name)
  values('1234','W.Z.D Book')
save transaction before_insert_data2
go
insert into stores(stor_id,stor_name)
  values('5678','foreat Books')
go
rollback transaction before_insert_data2
select * from stores

--存储存储过程
use pubs
if exists(select name from sysobjects where name= 'proc_calculate_taxes' and type='P')
drop procedure proc_calculate_taxes
go
create procedure proc_calculate_taxes (@p1 smallint=42,@p2 char(1),@p3 varchar(8)='char')
as
select *
from titles
--执行过程
EXECUTE PROC_CALCULATE_TAXES @P2='A'

本文来自CSDN博客,转载请标明出处:

http://blog.csdn.net/huwuling922/archive/2009/04/05/4049883.aspx

SQL SERVER 2008 函数大全 - 字符串函数
豆豆网   技术应用频道   2009年04月11日  【字号:小 中 大】 收藏本文

关键字: select 子表树 企业管理器 DBCC PAGE REVERT
SQL SERVER 2008 函数大全 - 字符串函数。
/* 字符函数 */
/* 返回字符表达式中最左侧字符的ASCII代码值 */
select Ascii('a') --a:97,A:65

/* 将整数ASCII代码转换为字符 */
select Char(97)--97:a,65:A

/* 返回表达式中指定字符的开始位置 */
select Charindex('b','abcdefg',5)

/* 以整数返回两个字符表达式的SOUNDEX值之差 */
select Difference('bet','bit')--3

/* 返回字符表达式最左侧指定数目的字符 */
select Left('abcdefg',3)--abc

/* 返回给定字符串表达的字符数 */
select Len('abcdefg')--7

/* 返回将大写字符转换为小字符的字符表达式 */
select Lower('ABCDEFG')--abcdefg

/* 返回删除了前导空格之后字符表达式 */
select Ltrim(' abcdefg')--abcdefg

/* 返回具有给定的整数代码的UNICODE字符 */
select Nchar(65)--A

/* 返回指定表达式中模式第一次出现的开始位置 */
select Patindex('%_cd%','abcdefg')--2

/* 返回为成为有效的SQL SERVER分隔标识符而添加了分隔符的UNICODE字符串 */
select Quotename('create table')

/* 用第三个表达式替换第一个表达式中出现的第二个表达式 */
select Replace('abcdefg','cd','xxx')--abxxxefg

/* 按指定次数重复表达式 */
select Replicate('abc|',4)--abc|abc|abc|abc|

/* 返回字符表达式的逆向表达式 */
select Reverse('abc')--cba

/* 返回字符表达式右侧指定数目的字符 */
select Right('abcd',3)--bcd

/* 返回截断了所有尾随空格之后的字符表达式 */
select Rtrim('abcd ')--abcd

/* 返回由四个字符表达的SOUNDEX代码 */
select Soundex('abcd')--A120

/* 返回由重复空格组成的字符串 */
select Space(10)--[ ]

/* 返回从默认表达转换而来的字符串 */
select Str(100)--[ 100]

/* */
select Str(100,3)--[100]

/* */
select Str(14.4444,5,4)--[14.44]

/* 删除指定长度的字符,并在指定的起点处插入另一组字符 */
select Stuff('abcdefg',2,4,'xxx')--axxxfg

/* 返回字符表达式,二进制,文本表达式或图像表达的一部分 */
select Substring('abcdefg',2,3)--bcd

/* 返回表达第一个字符的UNICODE整数值 */
select Unicode('a')--97

/* 返回将小写字符转换为大写字符的字符表达式 */
select Upper('a')--'A'

SQL Server函数大全[转]
--聚合函数
use pubs
go
select avg(distinct price)  --算平均数
from titles
where type='business'
go
use pubs
go
select max(ytd_sales)  --最大数
from titles
go

use pubs
go
select min(ytd_sales) --最小数
from titles
go

use pubs
go
select type,sum(price),sum(advance)  --求和
from titles
group by type
order by type
go

use pubs
go
select count(distinct city)  --求个数
from authors
go

use pubs
go
select stdev(royalty) --返回给定表达式中所有值的统计标准偏差
from titles
go

use pubs
go
select stdevp(royalty) --返回表达式中所有制的填充统计标准偏差
from titles
go

use pubs
go
select var(royalty) --返回所有值的统计方差
from titles
go

use pubs
go
select varp(royalty) --返回所有值的填充的统计方差
from titles
go

--数学函数

select sin(23.45),atan(1.234),rand(),PI(),sign(-2.34) --其中rand是获得一个随机数
--配置函数
SELECT @@VERSION --获取当前数据库版本
SELECT @@LANGUAGE --当前语言
--时间函数
select getdate() as 'wawa_getdate' --当前时间
select getutcdate() as 'wawa_getutcdate' --获取utc时间
select day(getdate()) as 'wawa_day' --取出天
select month(getdate()) as 'wawa_month' --取出月
select year(getdate()) as 'wawa_year' --取出年
select dateadd(d,3,getdate()) as wawa_dateadd --加三天,注意'd'表示天,'m'表示月,'yy'表示年,下面一


select datediff(d,'2004-07-01','2004-07-15') as wawa_datediff --计算两个时间的差
select datename(d,'2004-07-15') as wawa_datename --取出时间的某一部分
select datepart(d,getdate()) as wawa_datepart  --取出时间的某一部分,和上面的那个差不多
--字符串函数
select ascii(123) as '123',ascii('123') as '"123"',ascii('abc') as '"abc"' --转换成ascii码
select char(123),char(321),char(-123) --根据ascii转换成字符
select lower('ABC'),lower('Abc'),upper('Abc'),upper('abc') --转换大小写
select str(123.45,6,1), str(123.45,2,2) --把数值转换成字符串
select ltrim('    "左边没有空格"')  --去空格
select rtrim('"右边没有空格"     ') --去空格
select ltrim(rtrim('   "左右都没有空格"    ')) --去空格
select left('sql server',3),right('sql server',6) --取左或者取右

use pubs
select au_lname,substring(au_fname,1,1) --取子串
from authors
order by au_lname

select charindex('123','abc123def',2) --返回字符串中指定表达式的起始位置
select patindex('123','abc123def'),patindex('%123%','abc123def') --返回表达式中某模式第一次出现

的起始位置
select quotename('abc','{'),quotename('abc') --返回由指定字符扩住的字符串
select reverse('abc'),reverse('上海') --颠倒字符串顺序
select replace('abcdefghicde','cde','xxxx') --返回呗替换了指定子串的字符串
select space(5),space(-2)

--系统函数
select host_name() as 'host_name',host_id() as 'host_id',user_name() as 'user_name',user_id() as

'user_id',db_name() as 'db_name'
--变量的定义使用
--声明局部变量
declare @mycounter int
declare @last_name varchar(30),@fname varchar(20),@state varchar(2) --一下声明多个变量
--给变量赋值
use northwind
go
declare @firstnamevariable varchar(20),
@regionvariable varchar(30)
set @firstnamevariable='anne' --可以用set,也可以用select给变量赋值,微软推荐用set,但select在选择

一个值直接赋值时很有用
set @regionvariable ='wa'

select lastname,firstname,title  --用声明并赋值过的变量构建一个Select语句并查询
from employees
where firstname= @firstnamevariable or region=@regionvariable
go
--全局变量
select @@version  --返回数据库版本
select @@error  --返回最后的一次脚本错误
select @@identity  --返回最后的一个自动增长列的id

--while,break,continue的使用
--首先计算所有数的平均价格,如果低于30的话进入循环让所有的price翻倍,
--里面又有个if来判断如果最大的单价还大于50的话,退出循环,否则继续循环,知道最大单价大于50就break出

循环,呵呵,
--我分析的应该对吧.
use pubs
go
while (select avg(price) from titles) <$30
begin
update titles
  set price=price*2
  select max(price) from titles
  if(select max(price) from titles) >$50
  break
  else
  continue
end
print 'too much for the marker to bear'

--事务编程经典例子
--begin transaction是开始事务,commit transaction是提交事务,rollback transaction是回滚事务
--这个例子是先插入一条记录,如果出现错误的话就回滚事务,也就是取消,并直接return(返回),如果没错的话

就commit 提交这个事务了哦
--上面的那个return返回可以返回一个整数值,如果这个值是0的话就是执行的时候没出错,如果出错了就是一

个负数,
--这个return也可以用在存储过程中,可用用 exec @return_status= pro_name来获取这个值
use pubs
go
begin tran mytran
insert into stores(stor_id,stor_name)
  values('333','my books')
go
insert into discounts(discounttype,stor_id,discount)
  values('清仓甩卖','9999',50.00)
if @@error<>0
  begin
   rollback tran mytran
   print '插入打折记录出错'
   return
  end
commit tran mytran

--事务处理的保存点示例
--做了事务保存点后可以rollback(回滚)到指定的保存点,不至于所有的操作都不能用
use pubs
go
select * from stores
begin transaction testsavetran
insert into stores(stor_id,stor_name)
  values('1234','W.Z.D Book')
save transaction before_insert_data2
go
insert into stores(stor_id,stor_name)
  values('5678','foreat Books')
go
rollback transaction before_insert_data2
select * from stores

--存储存储过程
use pubs
if exists(select name from sysobjects where name= 'proc_calculate_taxes' and type='P')
drop procedure proc_calculate_taxes
go
create procedure proc_calculate_taxes (@p1 smallint=42,@p2 char(1),@p3 varchar(8)='char')
as
select *
from titles
--执行过程
EXECUTE PROC_CALCULATE_TAXES @P2='A'

SQL Server行列转换[转]
/*
标题:普通行列转换(version 2.0)
作者:爱新觉罗.毓华
时间:2008-03-09
地点:广东深圳
说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql

server 2005的有关写法。

问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74   84   94
张三 74   83   93
-------------------
*/

create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go

--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
  max(case 课程 when '语文' then 分数 else 0 end) 语文,
  max(case 课程 when '数学' then 分数 else 0 end) 数学,
  max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名

--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 +

']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)

--SQL SERVER 2005 静态SQL。
select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b

--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')

---------------------------------

/*
问题:在上述结果的基础上加平均分,总分,得到如下结果:
姓名 语文 数学 物理 平均分 总分
---- ---- ---- ---- ------ ----
李四 74   84   94   84.00  252
张三 74   83   93   83.33  250
*/

--SQL SERVER 2000 静态SQL。
select 姓名 姓名,
  max(case 课程 when '语文' then 分数 else 0 end) 语文,
  max(case 课程 when '数学' then 分数 else 0 end) 数学,
  max(case 课程 when '物理' then 分数 else 0 end) 物理,
  cast(avg(分数*1.0) as decimal(18,2)) 平均分,
  sum(分数) 总分
from tb
group by 姓名

--SQL SERVER 2000 动态SQL。
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 +

']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group

by 姓名'
exec(@sql)

--SQL SERVER 2005 静态SQL。
select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓

名) n
where m.姓名 = n.姓名

--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m ,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓

名) n
where m.姓名 = n.姓名')

drop table tb   

------------------
------------------

/*
问题:如果上述两表互相换一下:即表结构和数据为:
姓名 语文 数学 物理
张三 74 83 93
李四 74 84 94
想变成(得到如下结果):
姓名 课程 分数
---- ---- ----
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
--------------
*/

create table tb(姓名 varchar(10) , 语文 int , 数学 int , 物理 int)
insert into tb values('张三',74,83,93)
insert into tb values('李四',74,84,94)
go

--SQL SERVER 2000 静态SQL。
select * from
(
select 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 , 课程 = '物理' , 分数 = 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 end

--SQL SERVER 2000 动态SQL。
--调用系统表动态生态。
declare @sql varchar(8000)
select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name ,

'''') + ' , [分数] = ' + quotename(Name) + ' from tb'
from syscolumns
where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
order by colid asc
exec(@sql + ' order by 姓名 ')

--SQL SERVER 2005 动态SQL。
select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t

--SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。

--------------------
/*
问题:在上述的结果上加个平均分,总分,得到如下结果:
姓名 课程   分数
---- ------ ------
李四 语文   74.00
李四 数学   84.00
李四 物理   94.00
李四 平均分 84.00
李四 总分   252.00
张三 语文   74.00
张三 数学   83.00
张三 物理   93.00
张三 平均分 83.33
张三 总分   250.00
------------------
*/

select * from
(
select 姓名 as 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 as 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 as 姓名 , 课程 = '物理' , 分数 = 物理 from tb
union all
select 姓名 as 姓名 , 课程 = '平均分' , 分数 = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2))

from tb
union all
select 姓名 as 姓名 , 课程 = '总分' , 分数 = 语文 + 数学 + 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分'

then 4 when '总分' then 5 end

drop table tb

--/////////////////////////////

--> 测试数据: #T
if object_id('tempdb.dbo.#T') is not null drop table #T
create table #T (项目 nvarchar(5),值 int,位置 int)
insert into #T
select '项目1',15,1 union all
select '项目1',34,2 union all
select '项目1',56,3 union all
select '项目1',42,4 union all
select '项目2',56,1 union all
select '项目2',67,2 union all
select '项目2',31,3 union all
select '项目2',89,4 union all
select '项目3',45,1 union all
select '项目3',22,2 union all
select '项目3',8,3 union all
select '项目3',23,4

declare @sql varchar(8000)
set @sql=''
select @sql=@sql+',max(case when 项目='''+项目+''' then 值 end) ['+项目+']'
from #T group by 项目

set @sql=stuff(@sql,1,1,'')

exec ('select '+@sql+',位置 from #T group by 位置')

/*
项目1         项目2         项目3         位置
----------- ----------- ----------- -----------
15          56          45          1
34          67          22          2
56          31          8           3
42          89          23          4
*/

--/////////////////////////////
表A
UnitCode   UnitName TargetCode TargetValue         
23         北京公司     AAA        2222    
24         上海公司     BBB        3333       
25         深圳公司     CCC        4444
26         广州公司     DDD        5555   
27         加拿大公司   EEE        6666
28         加拿大公司   AAA        1234
表B
TargetCodeName                                                                                  

AAA       始发收入      
BBB       销售收入         
CCC       其他收入          
DDD       公里收入           
EEE       货机收入 
新出来的表后面的列根据B表Name来的
单位名称  始发收入 销售收入 其他收入 公里收入 货机收入  
深圳公司     0       0      4444      0          0 
北京公司   2222      0         0      0          0 
上海公司     0    3333         0      0          0 
广州公司     0       0         0    5555         0 
加拿大公司  1234     0         0      0       6666
--建立测试环境
set nocount on
create table tableA(UnitCode varchar(20),UnitName varchar(20),TargetCode varchar(20),TargetValue

int)
insert into tableA select '23','北京公司','AAA','2222'
insert into tableA select '24','上海公司','BBB','3333'
insert into tableA select '25','深圳公司','CCC','4444'
insert into tableA select '26','广州公司','DDD','5555'
insert into tableA select '27','加拿大公司','EEE','6666'
insert into tableA select '28','加拿大公司','AAA','1234'
go
create table tableB(TargetCode varchar(20),Name varchar(20))
insert into tableB select 'AAA','始发收入'
insert into tableB select 'BBB','销售收入'
insert into tableB select 'CCC','其他收入'
insert into tableB select 'DDD','公里收入'
insert into tableB select 'EEE','货机收入'
go

declare @sql varchar(8000)
set @sql='select unitname'
select @sql=@sql+',sum(case when targetcode='''+targetcode+''' then targetvalue else 0 end)['+
Name+']' from tableB
set @sql=@sql+' from tableA group by unitname'

exec(@sql)
--删除测试环境
drop table tableB
drop table tableA
set nocount off

/*
unitname             始发收入        销售收入        其他收入        公里收入        货机收入
-------------------- ----------- ----------- ----------- ----------- -----------
北京公司                 2222        0           0           0           0
广州公司                 0           0           0           5555        0
加拿大公司                1234        0           0           0           6666
上海公司                 0           3333        0           0           0
深圳公司                 0           0           4444        0           0
*/
Tag标签: SQL Server,SQL行列转换

SQLServer2005新的高效分页方法
作者:佚名    文章来源:网络    更新时间 :2008-10-29 15:34:51大 中 小
Select * FROM (
    select ROW_NUMBER()Over(order by cf_id desc) as rowId,* from T_Test
) as mytable
where rowId between 21 and 40 每页20条,第2页

ROW_NUMBER是SqlServer2005中的新特性

以下是利用本方法和传统利用Set RowCount方法存储过程的效率比较结果:

未建索引情况下:
500w数据: 存储过程1分20秒 , 新方法1分18秒
400w数据:存储过程47秒,新方法41秒
300w数据:存储过程35秒,新方法30秒
200w数据:存储过程25秒,新方法20秒
100W数据:存储过程12秒,新方法10秒
50W数据:存储过程 7秒,新方法 0秒

Microsoft SQL Server 2005 存储过程翻页(使用ROW_NUMBER函数)性能
作者:佚名    文章来源:网络    更新时间 :2008-10-29 19:16:48大 中 小

Create Procedure [dbo].[lan27_ListPages]
(
@Page int=1,/*传进页数*/
@Page_Size int=20,/*每页行数*/
@Page_Count int=0,/*页面总数*/
@Row_Count int=0,/*统计行数*/
@Get_Type nvarchar(10),/*返回类型*/
@SQL_Count nvarchar(2000),/*查询语句*/
@SQL_String nvarchar(3000),/*查询语句*/
@SQL_Order nvarchar(1000)/*排序字段*/
)
AS

Set NoCount ON--如果返回记录集,用这句话是个好习惯

/*判断页数*/
IF(@Page='' or @Page<1)
Begin
  Set @Page=1
End

/*判断行数*/
IF(@Page_Size='' or @Page_Size<1)
Begin
  Set @Page_Size=20
End

/*判断是否Count(*)*/
IF(@Page=1 or @Row_Count='' or @Row_Count<1)
Begin
  Set @SQL_Count=N'Select @Row_Count='+@SQL_Count
  Execute sp_executesql @SQL_Count,N'@Row_Count Int Output',@Row_Count output
End

/*页面总数*/
IF(@Row_Count%@Page_Size>0)
  Begin
   Set @Page_Count = (@Row_Count/@Page_Size)+1
  End
Else
  Begin
   Set @Page_Count = @Row_Count/@Page_Size
  End

/*判断首页*/
IF(@Page<1)
Begin
  Set @Page=1
End

/*判断尾页*/
IF(@Page>@Page_Count)
Begin
  Set @Page=@Page_Count
End

IF(@Get_Type='Get_Count')--获取统计信息
Begin
  Select @Page as Page,@Page_Count AS Page_Count,@Row_Count AS Row_Count
  Return
End

IF(@Get_Type='Get_Data')--获取数据记录
Begin
  Declare @List_ID1 int,@List_ID2 int
   Set @List_ID2=(@Page_Size*@Page)--当前页记录结束
   Set @List_ID1=(@List_ID2-@Page_Size)--当前页记录开始
  Set @SQL_String=N'Select * From (Select ROW_NUMBER() Over('
      +@SQL_Order
      +N')AS List_ID,'
      +@SQL_String
      +N')AS A Where A.List_ID>'
      +Cast(@List_ID1 AS Nvarchar)
      +N' and A.List_ID<='
      +Cast(@List_ID2 AS Nvarchar)
  Execute sp_executesql @SQL_String
  Return
End

SQL Server 2005对海量数据的处理(转自it168)
===========================================================
作者: SQLSERVER2005(http://sqlserver2005.itpub.net)
发表于:2007.11.01 13:03
分类: SQLSERVER 2005 管理
出处:http://sqlserver2005.itpub.net/post/22359/449312
---------------------------------------------------------------

超大型数据库的大小常常达到数百GB,有时甚至要用TB来计算。而单表的数据量往往会达到上亿的记录,并且

记录数会随着时间而增长。这不但影响着数据库的运行效率,也增大数据库的维护难度。除了表的数据量外,

对表不同的访问模式也可能会影响性能和可用性。这些问题都可以通过对大表进行合理分区得到很大的改善。

当表和索引变得非常大时,分区可以将数据分为更小、更容易管理的部分来提高系统的运行效率。如果系统有

多个CPU或是多个磁盘子系统,可以通过并行操作获得更好的性能。所以对大表进行分区是处理海量数据的一

种十分高效的方法。本文通过一个具体实例,介绍如何创建和修改分区表,以及如何查看分区表。

1、SQL Server 2005

SQL Server 2005是微软在推出SQL Server 2000后时隔五年推出的一个数据库平台,它的数据库引擎为关系型

数据和结构化数据提供了更安全可靠的存储功能,使用户可以构建和管理用于业务的高可用和高性能的数据应

用程序。此外,SQL Server 2005结合了分析、报表、集成和通知功能。这使得企业可以构建和部署经济有效

的BI解决方案,帮助团队通过记分卡、Dashboard、Web Services和移动设备将数据应用推向业务的各个领域

。无论是开发人员、数据库管理员、信息工作者还是决策者,SQL Server 2005都可以提供出创新的解决方案

,并可从数据中获得更多的益处。

它所带来的新特性,如T-SQL的增强、数据分区、服务代理和与.Net Framework的集成等,在易管理性、可用

性、可伸缩性和安全性等方面都有很大的增强。

2、表分区的具体实现方法

表分区分为水平分区和垂直分区。水平分区将表分为多个表。每个表包含的列数相同,但是行更少。例如,可

以将一个包含十亿行的表水平分区成 12 个表,每个小表表示特定年份内一个月的数据。任何需要特定月份数

据的查询只需引用相应月份的表。而垂直分区则是将原始表分成多个只包含较少列的表。水平分区是最常用分

区方式,本文以水平分区来介绍具体实现方法。

水平分区常用的方法是根据时期和使用对数据进行水平分区。例如本文例子,一个短信发送记录表包含最近一

年的数据,但是只定期访问本季度的数据。在这种情况下,可考虑将数据分成四个区,每个区只包含一个季度

的数据。

2.1、创建文件组

建立分区表先要创建文件组,而创建多个文件组主要是为了获得好的 I/O 平衡。一般情况下,文件组数最好

与分区数相同,并且这些文件组通常位于不同的磁盘上。每个文件组可以由一个或多个文件构成,而每个分区

必须映射到一个文件组。一个文件组可以由多个分区使用。为了更好地管理数据(例如,为了获得更精确的备

份控制),对分区表应进行设计,以便只有相关数据或逻辑分组的数据位于同一个文件组中。使用 ALTER

DATABASE,添加逻辑文件组名:
ALTER DATABASE [DeanDB] ADD FILEGROUP [FG1]
DeanDB为数据库名称,FG1文件组名。创建文件组后,再使用 ALTER DATABASE 将文件添加到该文件组中:
ALTER DATABASE [DeanDB] ADD FILE ( NAME = N'FG1',
FILENAME = N'C:DeanDataFG1.ndf' , SIZE = 3072KB ,
FILEGROWTH = 1024KB ) TO FILEGROUP [FG1]
类似的建立四个文件和文件组,并把每一个存储数据的文件放在不同的磁盘驱动器里。

2.2、创建分区函数

创建分区表必须先确定分区的功能机制,表进行分区的标准是通过分区函数来决定的。创建数据分区函数有

RANGE “LEFT | / RIGHT”两种选择。代表每个边界值在局部的哪一边。例如存在四个分区,则定义三个边界

点值,并指定每个值是第一个分区的上边界 (LEFT) 还是第二个分区的下边界 (RIGHT)。代码如下:
CREATE PARTITION FUNCTION [SendSMSPF](datetime)
AS RANGE RIGHT FOR VALUES ('20070401', '20070701', '20071001')
2.3、创建分区方案

创建分区函数后,必须将其与分区方案相关联,以便将分区指向至特定的文件组。就是定义实际存放数据的媒

体与各数据块的对应关系。多个数据表可以共用相同的数据分区函数,一般不共用相同的数据分区方案。可以

通过不同的分区方案,使用相同的分区函数,使不同的数据表有相同的分区条件,但存放在不同的媒介上。创

建分区方案的代码如下:
CREATE PARTITION SCHEME [SendSMSPS] AS PARTITION [SendSMSPF]
TO ([FG1], [FG2], [FG3], [FG4])
2.4、创建分区表

建立好分区函数和分区方案后,就可以创建分区表了。分区表是通过定义分区键值和分区方案相联系的。插入

记录时,SQL SERVER会根据分区键值的不同,通过分区函数的定义将数据放到相应的分区。从而把分区函数、

分区方案和分区表三者有机的结合起来。创建分区表的代码如下:
CREATE TABLE SendSMSLog
([ID] [int] IDENTITY(1,1) NOT NULL,
[IDNum] [nvarchar](50) NULL,
[SendContent] [text] NULL
[SendDate] [datetime] NOT NULL,
) ON SendSMSPS(SendDate)
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics