xugang

记录一个.NET 程序员的成长

 

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后相比,就是说两个表里有没有行完全相当的。

 

作者: XuGang   网名:钢钢
出处: http://xugang.cnblogs.com
声明: 本文版权归作者和博客园共有!转载时必须保留此段声明,且在文章页面明显位置给出原文连接。
标签: SQL, SQL Server

posted on 2011-10-18 16:02 钢钢 阅读(3408) 评论(17) 编辑 收藏

评论

#1楼 2011-10-18 16:30 guangrou      

的确很有用! 推荐 + 1

 回复 引用 查看   

#2楼 2011-10-18 16:40 Kevin Zou      

不错,收藏备用  回复 引用 查看   

#3楼 2011-10-18 16:44 杨曹贵      

不错,学习了!  回复 引用 查看   

#4楼 2011-10-19 08:08 goding      

不错,收藏  回复 引用 查看   

#5楼 2011-10-19 08:40 海南.胡勇      

多来个。  回复 引用 查看   

#6楼 2011-10-19 09:06 澐飞扬      

有用,收藏。  回复 引用 查看   

#7楼 2011-10-19 09:07 John Liu      

总结的不错。确实都很实用。  回复 引用 查看   

#8楼 2011-10-19 09:31 aayz001      

好文章要搜藏,以备后查。。  回复 引用 查看   

#9楼 2011-10-19 09:46 songmc      

印象中貌似ISNUMERIC有一些问题。用的时候需要注意一下:
SELECT ISNUMERIC(',.')
SELECT ISNUMERIC(CHAR(10))
SELECT ISNUMERIC(CHAR(13))
SELECT ISNUMERIC(CHAR(9))
SELECT ISNUMERIC('.')
SELECT ISNUMERIC(',')
 回复 引用 查看   

#10楼[楼主] 2011-10-19 10:10 钢钢      

@songmc

引用songmc:
印象中貌似ISNUMERIC有一些问题。用的时候需要注意一下:
SELECT ISNUMERIC(',.')
SELECT ISNUMERIC(CHAR(10))
SELECT ISNUMERIC(CHAR(13))
SELECT ISNUMERIC(CHAR(9))
SELECT ISNUMERIC('.')
SELECT ISNUMERIC(',')

我刚刚测试了一下,都返回“1” 了 !!!
这个真得注意! 应该算是微软的 bug 漏洞吧。

 回复 引用 查看   

#11楼 2011-10-19 10:33 zhou520ling      

谢谢LZ,收藏了  回复 引用 查看   

#12楼 2011-10-19 11:39 夏天爱上雨      

谢谢楼主  回复 引用 查看   

#13楼 2011-10-19 12:19 大豆男生      

sql server里还有一个很有用函数 sign(num) 返回-1或0或1  回复 引用 查看   

#14楼 2011-10-19 13:46 msyye      

@钢钢
这个不是BUG,也并非漏洞,你还没搞清楚这个函数!~
 回复 引用 查看   

#15楼 2011-10-19 13:53 guangrou      

@msyye
以下是来自微软官方的解释:
================================================================================
ISNUMERIC ( expression ) 确定表达式是否为有效的数值类型。
参数 expression 要计算的表达式。
返回类型 int

备注:
当输入表达式的计算结果为有效的 numeric 数据类型时,ISNUMERIC 返回 1;否则返回 0。
有效的 numeric 数据类型包括以下类型:
int
numeric
bigint
money
smallint
smallmoney
tinyint
float
decimal
real

返回值 1 指示可以将表达式转换为至少一种 numeric 类型。

注意:
对于不是数字的字符(如加号 (+)、减号 (-))和有效货币符号(如美元符号 ($))字符,ISNUMERIC 将返回 1。有关货币符号的完整列表,请参阅使用货币数据。

http://technet.microsoft.com/zh-cn/library/ms186272%28SQL.90%29.aspx

楼上的,不知道你还有什么要补充的没?

 回复 引用 查看   

#16楼[楼主] 2011-10-19 13:59 钢钢      

@msyye
莫非你所说的,就是微软官方所补充的 注意:

对于不是数字的字符(如加号 (+)、减号 (-))和有效货币符号(如美元符号 ($))字符,ISNUMERIC 将返回 1。
有关货币符号的完整列表,请参阅使用货币数据。


还是另有所因?

 回复 引用 查看   

#17楼 2011-10-19 15:19 湿袜子      

不错 能解决问题  回复 引用 查看   

导航

统计

公告



穷则独善其身
达则兼济天下


新闻

昵称:钢钢
园龄:4年7个月
荣誉:推荐博客
粉丝:172
关注:54

搜索

 
 

常用链接

我的标签

随笔分类(311)

随笔档案(288)

文章分类(26)

Blog

Tool

Total

Website

积分与排名

最新评论

阅读排行榜

评论排行榜

推荐排行榜