Sql Server常用函数及技巧
使用Sql Server好長時間了,今天特別想總結一下,算是回顧吧!
總結: 其實很多技巧,都是基于SQL Server自帶的System?Views,System?Stored Procedures,System Functions (常用函數都在在里面)。
常用函數:
1. ISNULL(columnName, '')
先判斷該字段是否為空,如果為空,返回''; 否則返回該字段本來的值。
2.?DATEDIFF(datepart,startdate,enddate)
不羅嗦,直接參考?鏈接
3. CONVERT函數
直接參考鏈接
4. LEN? 計算長度
5. OBJECT_NAME('object_id')? 通過object id得到object name
6. OBJECT_ID('object_name')? ?通過object name得到 object id
7. CAST 函數?
實用語句:
1. 有時候項目中定義的儲存過程比較多,需要確定某一個表被哪些stored procedure使用了,可以有如下兩種方法:
a. SSMS界面上,選中要查的表,右鍵,點擊查找依賴,就會顯示出來
b. 使用語句:? ?
exec sys.sp_depends <tableName>? ? 例如: exec sys.sp_depends 'TB_Student'
?
2. 查找 死鎖
用到系統表: sys.sysprocesses (其實是一個系統View)?
| 視圖中主要的字段: 1. Spid:Sql Servr 會話ID 2. Kpid:Windows 線程ID 3. Blocked:正在阻塞求情的會話 ID。如果此列為 Null,則標識請求未被阻塞 4. Waittype:當前連接的等待資源編號,標示是否等待資源,0 或 Null表示不需要等待任何資源 5. Waittime:當前等待時間,單位為毫秒,0 表示沒有等待 6. DBID:當前正由進程使用的數據庫ID 7. UID:執行命令的用戶ID 8. Login_time:客戶端進程登錄到服務器的時間。 9. Last_batch:上次執行存儲過程或Execute語句的時間。對于系統進程,將存儲Sql Server 的啟動時間 10.Open_tran:進程的打開事務個數。如果有嵌套事務,就會大于1 11.Status:進程ID 狀態,dormant = 正在重置回話 ; running = 回話正在運行一個或多個批處理 ; background = 回話正在運行一個后臺任務 ; rollback = 會話正在處理事務回滾 ; pending = 回話正在等待工作現成變為可用 ; runnable = 會話中的任務在等待獲取 Scheduler 來運行的可執行隊列中 ; spinloop = 會話中的任務正在等待自旋鎖變為可用 ; suspended = 會話正在等待事件完成 12.Hostname:建立鏈接的客戶端工作站的名稱 13.Program_name:應用程序的名稱,就是 連接字符串中配的 Application Name 14.Hostprocess:建立連接的應用程序在客戶端工作站里的進程ID號 15.Cmd:當前正在執行的命令 16.Loginame:登錄名? |
例子:
a. 檢查數據庫是否發生阻塞
先查找哪個鏈接的 blocked 字段不為0。如 SPID10的blocked 字段不為0,而是11。SPID 11 的 blocked 為0,就可以得出結論:此時有阻塞發生,10 被 11 阻塞住了。如果你發現一個連接的 blocked 字段的值等于它自己,那說明這個連接正在做磁盤讀寫,它要等自己的 I/O 做完。
b. 查找鏈接在那個數據庫上
檢查 dbid 即可。得到 dbid,可以運行以下查詢得到數據庫的名字:
3. 查看View或者Stored Procedure的定義語句,有時候通過SSMS界面比較慢,用語句較快
Select definition, * from sys.sql_modules使用系統表(嚴格意義上,是個View):sys.sql_modules?
?
4. 在Stored Procedure中查找關鍵字
之前用下面的語句,但是發現這條語句有問題,因為這里的ROUTINE_DEFINITION,只取到procedure內容的前4000個字符,導致查的結果不正確。
SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%keyWord%' AND ROUTINE_TYPE = 'PROCEDURE'用下面的語句,就可以查到:
SELECT OBJECT_NAME(object_id), OBJECT_DEFINITION(object_id) FROM SYS.PROCEDURES WHERE OBJECT_DEFINITION(object_id) LIKE '%keyWord%'看完上面的第3條,其實使用sys.sql_modules 也是可以用來查找關鍵字。
5.? 在數據庫中,我們會經常看到,一些表中,只有一個id做為主鍵,那我們怎么快速確認它是否是自增的呢?
使用下面的語句查詢,objectId和columnName根據實際情況填寫。如果id_identity的值為1,它就是自增的,否則,就不是自增的。
select id_identity, * from sys.columns where object_id = 'objectId' and name = 'columnName'一般在建表語句中,定義自增使用的是? identity(1, 1) , 表示自增,從1開始,遞增量為1。
CREATE TABLE T_test (ID int IDENTITY(1,1), Name varchar(50) ) 判段一個表是否具有標識列
可以使用 OBJECTPROPERTY 函數確定一個表是否具有 IDENTITY(標識)列,用法:
如果有,則返回1,否則返回0
判斷某列是否是標識列
可使用 COLUMNPROPERTY 函數確定 某列是否具有IDENTITY 屬性,用法
如果該列為標識列,則返回1,否則返回0
查詢某表標識列的列名
SQL Server中沒有現成的函數實現此功能,實現的SQL語句如下
轉載于:https://www.cnblogs.com/FocusIN/p/7341380.html
總結
以上是生活随笔為你收集整理的Sql Server常用函数及技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS故障排除详解(2): 进程相
- 下一篇: 腾讯云安全组规则导出