SQL Server ->> 系统相关的函数

$PARTITION

返回指定的分区函数的分区号

CREATE PARTITION FUNCTION RangePF1 ( INT )  
AS RANGE FOR VALUES (10, 100, 1000) ;  
GO  
SELECT $PARTITION.RangePF1 (10) ;  
GO  

结果

 

 

获取分区表的每个非空分区的行数,例子

SELECT $PARTITION.TransactionRangePF1(TransactionDate) AS Partition,   
COUNT(*) AS [COUNT] FROM Production.TransactionHistory   
GROUP BY $PARTITION.TransactionRangePF1(TransactionDate)  
ORDER BY Partition ;  
GO  

 

也可以作为筛选条件

SELECT * FROM Production.TransactionHistory  
WHERE $PARTITION.TransactionRangePF1(TransactionDate) = 5 ; 

 

数据压缩:COMPRESS 和 DECOMPRESS

使用GZIP压缩算法对数据进行压缩和解压缩。其实我想不出有什么场景会用到这个,这个主要是对表的单个字段的数据压缩存储,压缩后的数据类型是varbinary(max),但是比较麻烦,毕竟等于说是人工去压缩数据,而本身SQL SERVER已经有表\索引(准确说应该是分区级别)的压缩,从存储层面去压缩数据了。

select CAST(DECOMPRESS(COMPRESS(N'{"sport":"Tennis","age": 28,"rank":1,"points":15258, turn":17}')) as NVARCHAR(max)) ,
COMPRESS(N'{"sport":"Tennis","age": 28,"rank":1,"points":15258, turn":17}')

结果

 

 

 

会话上下文:CONTEXT_INFO 和 SESSION_CONTEXT

CONTEXT_INFO:可以通过SET CONTEXT_INFO来设置会话级别的上下文(二进制),然后就可以在会话级别使用CONTEXT_INFO函数来回去前面设置的会话上下文的值。

SESSION_CONTEXT:其实就像设置了一个会话级别的全局变量,调用存储过程sp_set_session_context设置。例如程序中会执行多个步骤,每个步骤执行不同的存储过程,在每个存储过程结束都设置全局变量,这样子只要检查上下文变量值就知道程序执行到哪一步了。

 

当前会话请求ID和事务ID: CURRENT_REQUEST_ID和 CURRENT_TRANSACTION_ID

CURRENT_TRANSACTION_ID取自sys.dm_tran_current_transaction,CURRENT_REQUEST_ID取自sys.dm_exec_requests。

 

字符串格式化:FORMATMESSAGE

FORMATMESSAGE可以进行参数替换,比起用拼接的方式简洁一些.  %s代表string, %i代表integer, %d代表decimal

SELECT FORMATMESSAGE('Signed int %i, %d %i, %d, %+i, %+d, %+i, %+d, %s', 5, -5, 50, -50, -11, -11, 11, 11, 'ahaha');

结果

 

HOST_ID和HOST_NAME

HOST_ID是返回连接到SQL SERVER的应用程序的进程ID号,举个例子,如果用SSMS执行HOST_ID,返回的就是SSMS在本地电脑的进程ID。而HOST_NAME是服务器名

 

XACT_STATE

XACT_STATE一般配合SET XACT_ABORT ON语句使用,返回3个值,1等于当前请求有活动的用户事务,可以做任何操作,0等于当前请求没有活动的用户事务,-1等于当前请求具有活动的用户事务,但出现了致使事务被归类为无法提交的事务的错误。

XACT_STATE 和 @@TRANCOUNT 函数都可用于检测当前请求是否具有活动的用户事务。 @@TRANCOUNT 不能用于确定事务是否已分类为不可提交的事务。 XACT_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  
        PRINT 'The transaction is in an uncommittable state.' +  
              ' Rolling back transaction.'  
        ROLLBACK TRANSACTION;  
    END;  
  
    -- Test whether the transaction is active and valid.  
    IF (XACT_STATE()) = 1  
    BEGIN  
        PRINT 'The transaction is committable.' +   
              ' Committing transaction.'  
        COMMIT TRANSACTION;     
    END;  
END CATCH;  
GO  

 

posted @ 2022-02-24 10:20  Jerry_Chen  阅读(70)  评论(0编辑  收藏  举报