SQL Server 常用內置函數


本文用於收集在運維中經常使用的系統內置(built-in)函數,持續整理中

一,常用的獲取元數據的函數

1,查看數據庫的ID和Name

db_id(‘DB Name’),db_name('DB ID')

2,查看對象的ID和Name,對象的Schema,對象的定義

OBJECT_ID ( 'schema_name . object_name','object_type' ) 
OBJECT_NAME ( object_id [, database_id ] ) 
OBJECT_SCHEMA_NAME ( object_id [, database_id ] )
OBJECT_DEFINITION ( object_id ) 

3,查看Schema的ID和Name,通過對象ID獲取對象的架構名(Schema)

SCHEMA_NAME ( [ schema_id ] )  
SCHEMA_ID ( [ schema_name ] ) 
OBJECT_SCHEMA_NAME ( object_id [, database_id ] )  

4,查看Column的Name

COL_NAME(table_id,column_id)

二,常用全局變量

1,SQL Server的Name,ServiceName和版本

@@SERVERNAME,@@SERVICENAME,@@VERSION

查看服務器名字,也可以使用函數 serverproperty('servername'),有時 serverproperty('servername') 和 @@servername 返回的值不同,這可能是修改服務器的名稱導致,使用如下腳本修復,並重啟service,檢查服務器的名稱:

--將兩者協調一致,再重啟 SQL Server 服務
if serverproperty('servername')<>@@servername  
begin  
    declare @server sysname  
    set @server= @@servername   
    exec sys.sp_dropserver @server = @server
    set @server  = cast(serverproperty('servername') as sysname)  
    exec sys.sp_addserver @server = @server ,@local = 'LOCAL'  
end

use master
go
select name ,@@servername,serverproperty('servername')
from sys.servers
where server_id=0    --Local Server ID = 0 
go

 2,返回當前module的ID,module包括:SP,UDF,Trigger

@@PROCID

--獲取當前Module Name
declare @ObjectName sysname;
select @ObjectName=object_name(@@ProcID)

3,返回當前Session的ID,當前的RequestID

@@SPID
CURRENT_REQUEST_ID() 

4,在當前Session中,返回上一條Query影響的數據行數量

@@ROWCOUNT 
ROWCOUNT_BIG ( ) 

5,當前Connection中,返回已開啟,但未結束的事務數量,查看當前事務的ID,和事務的狀態(1,0,-1)

XACT_STATE() 函數返回事務的狀態,1表示有Active Transaction,0表示沒有Active Transaction,-1表示有Active Transaction,但是有錯誤發生導致該事務未被提交。

@@TRANCOUNT 
CURRENT_TRANSACTION_ID( ) 
XACT_STATE() 

6,查看當前機器(Host)的名字(Machine Name和ID)

HOST_NAME () ,HOST_ID()

三,使用GZIP algorithm壓縮數據和解壓縮數據

COMPRESS ( expression ) 
DECOMPRESS ( expression )

在插入數據時,壓縮數據,壓縮之后的數據類型是varbinary(max)

INSERT INTO player (name, surname, info )  
VALUES (N'Ovidiu', N'Cracium', COMPRESS(N'{"sport":"Tennis","age": 28,"rank":1,"points":15258, turn":17}')); 

在查詢數據時,解壓縮數據,將數據從varbinary(max)強轉為原始類型

SELECT _id, name, surname, datemodified, CAST(DECOMPRESS(info) AS NVARCHAR(MAX)) AS info  
FROM player; 

四,調試函數

1,獲取異常消息

在TSQL中,使用try 和 catch編寫異常處理代碼,在catch子句中,使用debug函數,能夠獲取異常信息

--返回發生錯誤的代碼行號(LineNumber)
ERROR_LINE ( ) 
--返回錯誤號(ErrorNumber)
ERROR_NUMBER ( ) 
@@ERROR 
--返回錯誤消息(ErrorMessage)
ERROR_MESSAGE ( ) 
--返回發生錯誤的SP Name
ERROR_PROCEDURE ( ) 
--返回錯誤的嚴重度(Error Severity)
ERROR_SEVERITY ( ) 
--返回錯誤的狀態(Error State)
ERROR_STATE() 

在進行調試時,可以以下示例腳本代碼,將異常信息記錄在數據表中,以便進行代碼的故障排除

-- SET XACT_ABORT ON will render the transaction uncommittable when the constraint violation occurs.
SET XACT_ABORT ON;  
  
BEGIN TRY  
    BEGIN TRANSACTION;  
        -- A FOREIGN KEY constraint exists on this table. This statement will generate a constraint violation error.
        DELETE FROM Production.Product  
        WHERE ProductID = 980;  
    -- If the delete operation succeeds, commit the transaction. The CATCH block will not execute.
    COMMIT TRANSACTION;  
END TRY  
BEGIN CATCH  
    -- Test XACT_STATE for 0, 1, or -1.  
    -- If 1, the transaction is committable.  
    -- If -1, the transaction is uncommittable and should be rolled back.
    -- XACT_STATE = 0 means there is no transaction and a commit or rollback operation would generate an error.
  
    -- Test whether the transaction is uncommittable.
    IF (XACT_STATE()) = -1  
    BEGIN  
        --Logging Exception info, as the transaction is in an uncommittable state. Rolling back transaction.
        SELECT  
            ERROR_NUMBER() AS ErrorNumber,  
            ERROR_SEVERITY() AS ErrorSeverity,  
            ERROR_STATE() AS ErrorState,  
            ERROR_PROCEDURE() AS ErrorProcedure,  
            ERROR_LINE() AS ErrorLine,  
            ERROR_MESSAGE() AS ErrorMessage;   
        ROLLBACK TRANSACTION;  
    END;  
    -- Test whether the transaction is active and valid.  
    IF (XACT_STATE()) = 1  
    BEGIN  
        --'The transaction is committable. Committing transaction.'  
        COMMIT TRANSACTION;     
    END;  
END CATCH;  
GO 
View Code

2,拋出異常消息

在SQL Server 2012及之后的版本中,使用 Throw 關鍵字代替RaiseError,用於拋出異常,並將執行控制權轉移到Catch 代碼塊

THROW [error_number, error_message, error_state];

五,DBCC 命令

1,查看數據庫的隔離級別

DBCC USEROPTIONS

 

 

參考文檔:

Metadata Functions (Transact-SQL)

Configuration Functions (Transact-SQL)

System Functions (Transact-SQL)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM