SQL Server 中幾個有用的特殊函數
在SQL Server 的使用過程中,發現幾個很有用,但不太常用(或細節不太清楚)的函數(存儲過程):
遂記下,以備日后查詢。不敢獨享,與君共之。有用且看,無用略過。
1> isnumeric( expression )
數值類型包括(int、bigint、smallint、tinyint、numeric、money、smallmoney、float、decimal、real)
示例:
where isnumeric(columnname)<> 1;
go
2> isdate( expression )
print '有效的日期'
else
print '無效的日期'
3> patindex( '%pattern%' , expression )
-- 如果在全部有效的文本和字符數據類型中沒有找到該模式,則返回零。
-- 返回:4
上面示例返回的是第一個‘BB’的開始位置。
其實,使用 charindex 函數也能實現上面示例的查詢,如下:
--返回:4
-- 返回:7
select charindex('%[0-9][A-Z]%','AA_BB_9C_DD_AA_9F_CC_DD')
-- 返回:0
看出來沒有?patindex 函數可以使用通配符,而charindex 函數不能。也就是說:patindex 函數功能更強大!
4> newid( )
set @myid = newid()
print '@myid 的值是: '+ convert(varchar(255), @myid)
-- @myid 的值是: 0B939411-4827-485E-884B-5BEB1699CFEE
5> collate
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 排序規則的所有有效排序規則名稱的列表:
由于此存儲過程支持參數替換,因此 sp_executesql 比 execute 的功能更多;
由于 sql server 更可能重用 sp_executesql 生成的執行計劃,因此 sp_executesql 比 execute 更有效。
示例: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語句的拼接。
* 指定對表的所有列進行計算。如果有任一列是非可比數據類型,則 checksum 返回錯誤。
非可比數據類型有 text、ntext、image、xml 和 cursor,還包括以上述任一類型作為基類型的 sql_variant。
expression 除非可比數據類型之外的任何類型的表達式。
select * from t1 where checksum(*) not in ( select checksum(*) from t )
上面示例,等于是把t1表里的一行數據hash和t表一行數據hash后相比,就是說兩個表里有沒有行完全相當的。
| 作者: XuGang 網名:鋼鋼 |
| 出處: http://xugang.cnblogs.com |
| 聲明: 本文版權歸作者和博客園共有。轉載時必須保留此段聲明,且在文章頁面明顯位置給出原文連接地址! |
浙公網安備 33010602011771號