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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!