你該知道的-SQL里的這些新語法-函數

来源:http://www.cnblogs.com/double-K/archive/2016/12/09/6141471.html
-Advertisement-
Play Games

前言 最近幫客戶做資料庫優化的時候發現客戶系統使用了很多函數,自己竟然不知道是幹啥的,好歹做過好幾年開發的我必然不能忍!於是翻了翻資料自己學習了一下隨便也分享給群友。 巧用函數的霸氣作用———我做開發的時候就深深的體會到知道一個簡單的函數要省去多少代碼量,讓功能很簡單的就能實現。 註:以下提及的方法 ...


前言

  最近幫客戶做資料庫優化的時候發現客戶系統使用了很多函數,自己竟然不知道是幹啥的,好歹做過好幾年開發的我必然不能忍!於是翻了翻資料自己學習了一下隨便也分享給群友。

  巧用函數的霸氣作用———我做開發的時候就深深的體會到知道一個簡單的函數要省去多少代碼量,讓功能很簡單的就能實現。

  註:以下提及的方法執行環境需要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

 

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

註:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文鏈接!
若您覺得這篇文章還不錯請點擊下右下角的推薦,非常感謝!

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 通過項目學習收穫更大。 1、基於Android平臺實戰愛簡訊項目 下載地址:http://pan.baidu.com/s/1hr8CEry 2、Android平臺實戰CRM客戶關係管理(AChartEngine統計圖表、非同步任務、系統性能優化) 下載地址: http://pan.baidu.com/ ...
  • 有的時候會碰到軟鍵盤不好關閉,然後就去調界面代碼,發現不行,說到底還是對軟鍵盤不熟悉的原因,軟鍵盤windowSoftInputMode有很多種 如果你預設的activity的模式為預設的,或者stateHidden|adjustPan等,那你在某些情況下是關不了( hideSoftInputFro ...
  • 最近在做一個活動頁面:用戶上傳一張圖片進行縮放、旋轉後點擊下一步填寫內容後生成圖片! 做好後經過各種測試是沒有問題的,基本沒有什麼明顯BUG,流程都能走通,但是嵌入到APP後,問題就來了! 在IOS上基本還可以,在Android上有明顯問題,下麵就是我要講的: 在Android中,當我們通過WebV ...
  • 一、鎖卡背景介紹 鎖卡即SIMLock,當手機開機啟動或者插入SIM卡時,手機modem側預置在NV項中的配置信息會與SIM卡中的信息做比對,檢測是否匹配。若匹配,則SIM卡可以正常使用。若不匹配,則SIM卡相關功能均無法正常使用,例如撥打電話、發送簡訊及上網等;或者是只能註冊2G網,不能註冊4G。 ...
  • 前記 公司內部使用的是MapR版本的Hadoop生態系統,因而從MapR的官網看到了這篇文文章:An In-Depth Look at the HBase Architecture,原本想翻譯全文,然而如果翻譯就需要各種咬文嚼字,太麻煩,因而本文大部分使用了自己的語言,並且加入了其他資源的參考理解以 ...
  • 註:1、本文未經博主同意,不得轉載! 2、所有終端語句都分行顯示,以免大家看錯; 直接開始,過程中對每一步可能出現的錯誤都進行了說明。 1、安裝好xampp,然後打開終端,輸入: mysql -u root -p 成功進入了,擦,你運氣真好,後面不用看了。 2、如果提示command not fou ...
  • 下麵操作預設在安裝Oralce資料庫的伺服器上運行。 1)確保Oracle 基本服務都已啟動 OracleDBConsoleorcl OracleOraDb11g_home1TNSListener OracleServiceORCL 2)打開命令行,使用 sqlplus nokia_user/ora ...
  • VS在安裝之前需要安裝.NET Framework,我安裝的是4.0版本。但是安裝進度條到一半左右時就卡住不動了。前前後後重試多次,還有幾次重新開機,但都沒用。 開始還以為是安裝的系統有問題。後來在網上求助,嘗試幾次之後終於找到瞭解決方案。這裡記下來,方便以後使用。以下為主要的操作步驟: 1. 需要 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...