SQL Server 中几个有用的特殊函数

在SQL Server 的使用过程中,发现几个很有用,但不太常用(或细节不太清楚)的函数(存储过程):

isnumeric,isdate,patindex,newid,collate,sp_executesql,checksum

遂记下,以备日后查询。不敢独享,与君共之。有用且看,无用略过。

1> isnumeric( expression )

-- 返回值 1 | 0,判断是否是数字类型。

数值类型包括(int、bigint、smallint、tinyint、numeric、money、smallmoney、float、decimal、real)

示例:

select * from tablename
where isnumeric(columnname)<> 1;
go

以上示例使用 isnumeric 返回所有非数值的数据行。

2> isdate( expression )

-- 如果 expression 是有效的 date、time 或 datetime 值,则返回 1;否则返回 0。

示例:

if isdate(‘2009-05-12 10:19:41.177‘) = 1
    print ‘有效的日期‘
else
    print ‘无效的日期‘

上面的示例使用 isdate 测试某一字符串是否是有效的 datetime。

3> patindex( ‘%pattern%‘ , expression )

-- 返回指定表达式中某模式第一次出现的起始位置;

-- 如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。

‘pattern‘ : 一个通配符字符串。pattern 之前和之后必须有 % 字符(搜索第一个或最后一个字符时除外)。

expression : 通常为要在其中搜索指定模式的字符串数据类型列。

示例:

select patindex(‘%BB%‘,‘AA_BB_CC_DD_AA_BB_CC_DD‘)
-- 返回:4

上面示例返回的是第一个‘BB’的开始位置。

其实,使用 charindex 函数也能实现上面示例的查询,如下:

select charindex(‘BB‘,‘AA_BB_CC_DD_AA_BB_CC_DD‘)
--返回:4

patindex 函数与 charindex 函数的区别:

select patindex(‘%[0-9][A-Z]%‘, ‘AA_BB_9C_DD_AA_9F_CC_DD‘)
-- 返回:7 
select charindex(‘%[0-9][A-Z]%‘,‘AA_BB_9C_DD_AA_9F_CC_DD‘)
-- 返回:0

看出来没有?patindex 函数可以使用通配符,而charindex 函数不能。也就是说:patindex 函数功能更强大!

4> newid( )

-- 创建 uniqueidentifier 类型的唯一值。

这个函数总是能返回一个新的GUID号码,它永远不会重复,而且毫无规律。

示例:

declare @myid uniqueidentifier
set @myid = newid()
print ‘@myid 的值是: ‘+ convert(varchar(255), @myid)

-- @myid 的值是: 0B939411-4827-485E-884B-5BEB1699CFEE

5> collate

-- 一个子句,可应用于数据库定义或列定义以定义排序规则,或应用于字符串表达式以应用排序规则转换。

collate 子句只能应用于 char、varchar、text、nchar、nvarchar 和 ntext 数据类型。

示例:

drop table #tempTalbe
go
create table #tempTalbe
(
   _id    int,
   _name  varchar(30)
)
go
insert into #tempTalbe values(1,‘中‘);
insert into #tempTalbe values(2,‘国‘);
insert into #tempTalbe values(3,‘人‘);

select * from #tempTalbe
order by _name
collate latin1_general_cs_as_ks_ws asc;
go
/* 显示结果:
_id         _name
----------- ------------------------------
1           中
2           国
3           人
*/

select * from #tempTalbe 
order by _name 
collate Chinese_PRC_CS_AS_KS_WS asc;
go
/* 显示结果:
_id         _name
----------- ------------------------------
2           国
3           人
1           中
*/

注意:

可以执行系统函数 fn_helpcollations 来检索 Windows 排序规则和 SQL Server 排序规则的所有有效排序规则名称的列表:

select * from fn_helpcollations()

6> sp_executesql 存储过程

建议您在执行字符串时,使用 sp_executesql 存储过程而不要使用 execute 语句。

由于此存储过程支持参数替换,因此 sp_executesql 比 execute 的功能更多;

由于 sql server 更可能重用 sp_executesql 生成的执行计划,因此 sp_executesql 比 execute 更有效。

示例:

create table #tb_suer( id int)
go
insert into #tb_suer values(1234)
go

declare @tbname nvarchar(20)
declare @sql nvarchar(500)
set @tbname=‘#tb_suer‘
set @sql=‘select * from ‘ + @tbname
execute sp_executesql @sql
/* 结果:
id
-----------
1234
*/上面示例演示了SQL语句的拼接。

7> checksum

--  返回按照表的某一行或一组表达式计算出来的校验和值。 checksum 用于生成哈希索引。

checksum ( * | expression [ ,...n ] )
*    指定对表的所有列进行计算。如果有任一列是非可比数据类型,则 checksum 返回错误。
      非可比数据类型有 text、ntext、image、xml 和 cursor,还包括以上述任一类型作为基类型的 sql_variant。
expression    除非可比数据类型之外的任何类型的表达式。

示例:

-- 找出在T1有,T表没有的记录。
select * from t1 where checksum(*) not in ( select checksum(*) from t )

上面示例,等于是把t1表里的一行数据hash和t表一行数据hash后相比,就是说两个表里有没有行完全相当的。

http://blog.csdn.net/qq_25627143/article/details/50646405

时间: 2024-12-15 08:59:42

SQL Server 中几个有用的特殊函数的相关文章

SQL Server中一些有用的日期sql语句

1.一个月第一天的 SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 2.本周的星期一 SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) 3.一年的第一天 SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) 4.季度的第一天 SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) 5.当天的半夜 SELECT DATEAD

十步优化SQL Server中的数据访问(转载)

原文地址:http://tech.it168.com/a2009/1125/814/000000814758.shtml 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调查访问变慢的原因. 经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表

SQL Server中关于跟踪(Trace)那点事

前言 一提到跟踪俩字,很多人想到警匪片中的场景,同样在我们的SQL Server数据库中“跟踪”也是无处不在的,如果我们利用好了跟踪技巧,就可以针对某些特定的场景做定向分析,找出充足的证据来破案. 简单的举几个应用场景: 在线生产库为何突然宕机?数百张数据表为何不翼而飞?刚打好补丁的系统为何屡遭黑手?新添加的信息表为何频频丢失?某张表字段的突然更改,究竟为何人所为?这些个匿名的访问背后,究竟是人是鬼?突然增加的增量数据,究竟是对是错?数百兆的日志爆炸式的增长背后又隐藏着什么?这一且的背后,是应用

转载: SQL Server中的索引

http://www.blogjava.net/wangdetian168/archive/2011/03/07/347192.html 1 SQL Server中的索引 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度.索引包含由表或视图中的一列或多列生成的键.这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行. 表或视图可以包含以下类型的索引: 聚集索引 聚集索引根据数据行的键值在表或视图中排序和存储这些数据行.索引定义中包含聚集索

SQL Server中的事务与锁

了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂,不能保证数据的安全正确读写. 死锁:是数据库性能的重量级杀手之一,而死锁却是不同事务之间抢占数据资源造成的. 不懂的听上去,挺神奇的,懂的感觉我在扯淡,下面带你好好领略下他们的风采,嗅査下他们的狂骚.. 先说事务--概念,分类 用华仔无间道中的一句来给你诠释下:去不了终点,回到原点. 举例说明: 在一个事务中,你写啦2条sql语句,一

SQL Server中的SQL语句优化与效率

很多人不知道SQL语句在SQL SERVER中是如何执行的,他们担心自己所写的SQL语句会被SQL SERVER误解.比如: select * from table1 where name='zhangsan' and tID > 10000 和执行: select * from table1 where tID > 10000 and name='zhangsan' 一些人不知道以上两条语句的执行效率是否一样,因为如果简单的从语句先后上看,这两个语句的确是不一样,如果tID是一个聚合索引,那

【转】SQL Server中的事务与锁

原文出处:http://www.cnblogs.com/knowledgesea/p/3714417.html 了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂,不能保证数据的安全正确读写. 死锁:是数据库性能的重量级杀手之一,而死锁却是不同事务之间抢占数据资源造成的. 不懂的听上去,挺神奇的,懂的感觉我在扯淡,下面带你好好领略下他们的风采,嗅査下他们的狂骚.. 先说事务--概念,分

SQL Server中的事物

1.事务的四个属性 原子性Atomicity,一致性Consistency,隔离性Isolation,持久性Durability ,即ACID特性. 原子性:事务必须是一个完整工作的单元,要么全部执行,要么全部不执行. 一致性:事务结束的时候,所有的内部数据都是正确的. 隔离性:并发多个事务时,各个事务不干涉内部数据,处理的都是另外一个事务处理之前或之后的数据. 持久性:事务提交之后,数据是永久性的,不可再回滚. 2.在SQL Server中事务被分为3类常见的事务 自动提交事务:是SQL Se

SQL Server中的事务与锁(转)

转自:http://www.cnblogs.com/knowledgesea/p/3714417.html 了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂,不能保证数据的安全正确读写. 死锁:是数据库性能的重量级杀手之一,而死锁却是不同事务之间抢占数据资源造成的. 不懂的听上去,挺神奇的,懂的感觉我在扯淡,下面带你好好领略下他们的风采,嗅査下他们的狂骚.. 先说事务--概念,分类