前言 最近幫客戶做資料庫優化的時候發現客戶系統使用了很多函數,自己竟然不知道是幹啥的,好歹做過好幾年開發的我必然不能忍!於是翻了翻資料自己學習了一下隨便也分享給群友。 巧用函數的霸氣作用———我做開發的時候就深深的體會到知道一個簡單的函數要省去多少代碼量,讓功能很簡單的就能實現。 註:以下提及的方法 ...
前言
最近幫客戶做資料庫優化的時候發現客戶系統使用了很多函數,自己竟然不知道是幹啥的,好歹做過好幾年開發的我必然不能忍!於是翻了翻資料自己學習了一下隨便也分享給群友。
巧用函數的霸氣作用———我做開發的時候就深深的體會到知道一個簡單的函數要省去多少代碼量,讓功能很簡單的就能實現。
註:以下提及的方法執行環境需要SQL2012及以上版本
--------------博客地址---------------------------------------------------------------------------------------
原文地址: http://www.cnblogs.com/double-K/
如有轉載請保留原文地址!
廢話不多說,直接開整-----------------------------------------------------------------------------------------
NO.1 PARSE 和 TRY_PARSE
PARSE 函數的功能是把字元串值轉換成指定類型,這個記得以前只在寫程式的時候用,現在資料庫也能用了
1 SELECT PARSE('2016/12/07' AS datetime2 USING 'zh-CN' ) AS Result; 2 3 DECLARE @date1 VARCHAR(8); 4 SET @date1 = CONVERT(VARCHAR(17), GETDATE(), 22); 5 SELECT PARSE(@date1 AS DATEtime using 'en-GB');
TRY_PARSE 如果強制轉換失敗,則返回 Null。 TRY_PARSE 僅用於從字元串轉換為日期/時間和數字類型。
註:默寫情況因為你不能把字元串轉換為“DATE”數據類型,所以這條“SELECT”語句就會報錯。但是 T-SQL 現在支持“TRY_PARSE”函數,頊名思義就是支持我們做轉換測試的。
TRY_PARSE 如果強制轉換失敗,則返回 Null。
另外還有TRY_CONVERT 、TRY_CAST函數功能都類似。
具體請參見: https://msdn.microsoft.com/zh-cn/library/hh213316.aspx
https://msdn.microsoft.com/zh-cn/library/hh213126.aspx
NO.2 CHOOSE 函數
CHOOSE 函數的功能是從兩個或多個值的列表中返回一個值,根據指定索引值進行判斷。索引值是從“1”計起的整數,也就是該函數的第一個參數。該參數後面跟著就是值列表。
也可以結合業務這樣玩
還可以這樣玩
具體請參見:https://msdn.microsoft.com/zh-cn/library/hh213019
NO.3 IIF 函數
IIF 函數支持測試表達式,基於測試結果返回特定值。“IIF”函數有三個參數:有效的布爾表達式,如果表達式為真返回的值和如果表達式為假返回的值。(你可以把“IIF”函數看作是“CASE”詫句的簡寫版。)
也可以結合業務這樣玩
NO.4 CONCAT 函數
CONCAT 採用可變數量的字元串參數,並將它們串聯成單個字元串。 它需要至少兩個輸入值;否則將引發錯誤。 所有參數都隱式轉換為字元串類型,然後串聯在一起。 Null 值被隱式轉換為空字元串。 如果所有參數都為 Null,則返回 varchar(1) 類型的空字元串。 隱式轉換為字元串的過程遵循現有的數據類型轉換規則。
直接使用字元串 “+”拼接
---會返回NULL declare @a char(10) set @a = null select @a + 'a' ---會報錯 declare @b int set @b = 1 select @b + 'a'
contact可以這麼玩(所有參數都隱式轉換為字元串類型,這裡的int 類型 11)
SELECT CONCAT ( 'Happy ', 'Birthday ', 11, '/', '25' ) AS Result;
也可以這麼玩
SELECT CONCAT(Name, ' (', ProductNumber, ')') AS NewName FROM Production.Product WHERE ProductID = 970;
具體請參見:https://msdn.microsoft.com/zh-cn/library/hh231515.aspx
NO.5 DATEFROMPARTS、TIMEFROMPARTS、DATETIMEFROMPARTS 和 DATETIME2FROMPARTS
略去概念描述,一看就懂
1 SELECT DATEFROMPARTS(2016, 12, 7); --年,月,日 2 SELECT TIMEFROMPARTS(23, 4, 18, 53, 3); --時,分,秒,秒的小數部分,精度 3 SELECT DATETIMEFROMPARTS(2016, 12, 7, 23, 4, 18, 53); --年,月,日,時,分,秒,秒的小數部分,預設3位精度 4 SELECT DATETIME2FROMPARTS(2016, 12, 7, 23, 4, 18, 53, 7); --年,月,日,時,分,秒,秒的小數部分,可指定精度
NO.6 EOMONTH 函數
一個有趣的函數,返回包含指定日期的月份的最後一天(具有可選偏移量)。
具體請參見:https://technet.microsoft.com/zh-cn/library/hh213020.aspx
NO.7 LAG 與 LEAD
訪問相同結果集中先前行的數據,而用不使用自聯接。 LAG 以當前行之前的給定物理偏移量來提供對行的訪問。在 SELECT 語句中使用此分析函數可將當前行中的值與先前行中的值進行比較。
概念比較模糊上例子一看就知道了
1 WITH test 2 as 3 ( 4 select NULL as score 5 UNION ALL 6 select 10 7 UNION ALL 8 select 20 9 UNION ALL 10 select 30 11 UNION ALL 12 select 40 13 UNION ALL 14 select 50 15 ) 16 select ROW_NUMBER() over(order by score) as rownum 17 ,score 18 ,LEAD(score) over(order by score) as nextscore1 19 ,LEAD(score,1) over(order by score) as nextscore2 20 ,LEAD(score,1,0) over(order by score) as nextscore3 21 ,LEAD(score,2) over(order by score) as nextscore4 22 ,LAG(score) over(order by score) as previousscore1 23 ,LAG(score,1) over(order by score) as previousscore2 24 ,LAG(score,1,0) over(order by score) as previousscore3 25 ,LAG(score,2) over(order by score) as previousscore4 26 from test
具體請參見:https://msdn.microsoft.com/zh-cn/library/hh231256.aspx
https://msdn.microsoft.com/zh-cn/library/hh213125.aspx
NO.8 序列 SEQUENCE
從 SQL Server 2012 開始,你現在可以定義序列資料庫對象了。序列提供了生成一組唯一數字值的機制,可以在整個資料庫範圍內使用,而不是僅局限於一個表,與“IDENTITY”屬性的用法有點類似。儘管你可以使用“IDENTITY”
屬性生成在整個資料庫中可用的數字值,但那個過程有點麻煩。序列功能使得一切更容易了。
具體參見:https://msdn.microsoft.com/zh-cn/library/ff878091.aspx
http://www.cnblogs.com/CareySon/archive/2012/03/12/2391581.html
NO.9 使用結果集 2012分頁方法增強
2012分頁方法增強不僅使得分頁變得更容易,也在效率上有了一定的提升。
具體參見:http://www.cnblogs.com/CareySon/archive/2012/03/09/2387825.html
NO.10 drop table if exists
在我們寫T-SQL要刪除某個對象(表、存儲過程等)時,一般會習慣先用IF語句判斷該對象是否存在,然後DROP,比如:
create table DropIFExists(a int) --老寫法 IF OBJECT_ID('dbo.DropIFExists','U') IS NOT NULL DROP TABLE DropIFExists --或 IF EXISTS (SELECT * FROM sys.objects where name = 'DropIFExists') DROP TABLE DropIFExists --SQL2016中新增 drop table if exists DropIFExists
NO.11 RESULT SETS
WITH RESULT SETS可以重新定義從存儲過程中返回結果的欄位名和數據類型。這會使得向擁有特定欄位名和數據類型的臨時表的結果集中插入記錄將變得非常容易,並且不需要依賴存儲過程返回了哪些內容。
WITH RESULT SETS子句同樣可以使用在存儲過程中,存儲過程會返回大量結果集,並且每個結果集都可以自定義各自的欄位名和數據類型。
1 CREATE PROCEDURE GetPerson 2 AS 3 BEGIN 4 SELECT TOP 10 BUSINESSENTITYID,CONCAT( FirstName ,' ',MiddleName,' ' , LastName) AS Name 5 FROM [Person].[Person] 6 END 7 GO 8 EXECUTE GetPerson 9 GO 10 EXECUTE GetPerson 11 WITH RESULT SETS 12 ( 13 ( 14 PersonId INT, 15 PersonName VARCHAR(150) 16 ) 17 ) 18 GO
----------------------------------------------------------------------------------------------------
註:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文鏈接!
若您覺得這篇文章還不錯請點擊下右下角的推薦,非常感謝!