PCB SQL SERVER 枚举分割函数(枚举值分解函数)

在SQL SERVER字段采用枚举值作为字段后,如果直接查看字段的值是很难判断这个字段的带表什么意思,

在这里介绍如用函数的方法实现枚举值分割,只有分割后才很方便知道枚举值的意思。

一.问题说明

1.如下为:单个枚举值清单如下

十进制带表枚举的值,每个值带表对应的工厂

单枚举:

1带表P1工厂,2带表P2工厂     ----通过对应,一眼看到对应关系

叠加枚举:

3带表P1与P2工厂                     ----简单叠加枚举,难度增大了就是不容易找到对应关系

难度再加大一点:

39 带表什么 工厂呢

是不是一时找不到解呀,实际39分解为:1 2 4 32 ,分别带表表P1,P2,P3,P7 四个工厂,

那如何叠加后的枚举值分解呢,这就是下面要解决的问题呢

二.C# 写SQL SERVER 枚举分割函数

 public partial class SQLfunction
    {
        /// <summary>
        /// SQL Server 枚举集合分割方法
        /// </summary>
        /// <param name="EnumNumCount"></param>
        /// <returns></returns>
        [Microsoft.SqlServer.Server.SqlFunction(
            DataAccess = DataAccessKind.Read,
            IsDeterministic = true,
            Name = "NumSplit",
            FillRowMethodName = "NumSplit_FillRow",
            TableDefinition = "EnumNumCount int")]
        public static IEnumerable NumSplit(SqlInt32 EnumNumCount)
        {
            List<EnumData> resultDataList = new List<EnumData>();
            string bin2 = Convert.ToString((int)EnumNumCount, 2);
            int NoOrderno = 1;
            for (int i = 0; i < bin2.Length; i++)
            {
                if (bin2[i] == ‘1‘)
                {
                    resultDataList.Add(new EnumData(NoOrderno, (int)Math.Pow(2, bin2.Length - i - 1)));
                    NoOrderno++;
                }
            }
            return resultDataList;
        }

        /// <summary>
        /// 填充数据方法
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="serialNumber"></param>
        /// <param name="stringValue"></param>
        public static void NumSplit_FillRow(Object obj, out SqlInt32 No_, out SqlInt32 EnumValue_)
        {
            EnumData EnumData_ = (EnumData)obj;
            No_ = EnumData_.No;
            EnumValue_ = EnumData_.EnumValue;
        }
        /// <summary>
        /// 定义返回类型
        /// </summary>
        public class EnumData
        {
            /// <summary>
            /// 序号,即行号
            /// </summary>
            public SqlInt32 No { get; set; }

            /// <summary>
            /// 分割后的每个分解后的枚举值
            /// </summary>
            public SqlInt32 EnumValue { get; set; }

            public EnumData(SqlInt32 No_, SqlInt32 EnumValue_)
            {
                No = No_;
                EnumValue = EnumValue_;
            }
        }
    }

三.SQL SERVER修改程序集与创建枚举分割函数

alter  ASSEMBLY SQLfunctionAssembly
FROM ‘D:\SQLClr.dll‘      --改为自己C#写的dll路径填写
WITH PERMISSION_SET = UNSAFE;   

--枚举分割函数
CREATE  FUNCTION [dbo].[NumSplit](@EnumNumCount [int])
RETURNS  TABLE (
    [No] [int] NULL,
    [EnumValue] [int] NULL
) WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [SQLfunctionAssembly].[SQLClr.SQLfunction].[NumSplit] --[SQL程序集名].[命名空间.类名].[方法名] 

四.枚举分割函数测试

一.测试枚举值33分割

33分解为:1  32 ,分别带表表P1,P7 两个工厂

SELECT EnumValue FROM FP_EMSDB_PUB.dbo.NumSplit(33)

二.测试枚举值39分割

39分解为:1 2 4 32 ,分别带表表P1,P2,P3,P7 四个工厂

SELECT EnumValue FROM FP_EMSDB_PUB.dbo.NumSplit(39)

五.小结

由于枚举值存于存在数据库,写了个函数可以非常方便的查看分解后的值.

但从实际功能出发的话,一般是用C#代码进行枚举值分解,分解后的值再转到UI前台前面展示,

原文地址:https://www.cnblogs.com/pcbren/p/9678329.html

时间: 2024-11-05 19:25:35

PCB SQL SERVER 枚举分割函数(枚举值分解函数)的相关文章

SQL Server表分区的NULL值问题

SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,往往会被大家吐槽 人家MySQL支持四种类型:RANGE分区.LIST分区.HASH分区.KEY分区 共同点是MySQL跟SQL Server也有分区对齐的问题,都是水平切分,大家都允许分区列存在NULL值 这次我们测试SQL Server表分区的分区列的NULL值,究竟NULL值是被存放在哪个区间,以前一直没有注意 测试脚本 --1.创建文件组 ALTER DATABASE [sss] ADD

速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数

[源码下载] 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函数返回值 可变函数 匿名函数 闭包函数 回调函数 示例1.函数的相关知识点 1(基础)function/function1.php <?php /** * 函数的相关知识点 1(基础) */ // 可以在相关的 function 声明语句之前调用该函数 f1(); function f1() { echo "f1"; echo "<br />"; } // 这里调用

SQL server从入门精通---- T-sql基本语句+函数与存储过程

-----------------T_SQL------------------------------ --1.全局变量------------------------------------- print @@identity --最后一次插入的标识值 print @@language --当前使用语言 print @@version --版本号 print @@servername--服务名 --2.自定义变量 ----1.声明用declare declare @i int,@j int

【Transact-SQL】SQL Server 2012新功能之一:转换函数

在SQL Server 2012中,新增了几个转换函数,用于支持数据类型的强制转化. 由于之前主要用的是SQL Server 2008R2,而公司的项目为了提高开发效率,很多表的列都为varchar类型,但也会存储数字. 当对这些列进行聚合计算,比如sum时,要先进行cast转换为numeric类型,经常会报错,现在有了这些新的函数,可以先try一下,通过判断返回值是否为null,我们可以判断字段值是否为数字,如果不是数字,就直接过滤到,所以这些函数非常实用,希望对大家有用. 1.PARSE函数

SQL Server进阶(十五)常用函数

在SQL 2012基础教程中列出子句是按照以下顺序进行逻辑处理. FROM WHERE GROUP BY HAVING SELECT ORDER BY IF EXISTS (SELECT 1 FROM TableName WHERE UserCode = @UserCode) BEGIN UPDATE TableName SET NotPushBeginTime = @NotPushBeginTime, NotPushEndTime = @NotPushEndTime WHERE UserCod

PCB SQL SERVER 邮箱配置与发邮件

一.开启SQL SERVER发邮件功能 --开启发邮件功能 exec sp_configure 'show advanced options',1 reconfigure with override go exec sp_configure 'database mail xps',1 reconfigure with override go 二.邮箱配置 1.代码创建邮箱配置 --创建邮件帐户信息 exec msdb.dbo.sysmail_add_account_sp @account_nam

MS SQL Server的LTRIM,RTRIM和TRIM函数

在MS SQL Server 2017有了一个新函数TRIM,整合以前版本LTRIM和RTRIM. 这几个函数都是去除字符串头部后尾部的空格. DECLARE @str NVARCHAR(MAX) = N' Insus.NET ' SELECT @str AS [str], [dbo].[svf_StringLength](@str) AS [length] SELECT LTRIM(@str) AS [str], [dbo].[svf_StringLength](LTRIM(@str)) AS

sql server 自增列,值突然增大1000的情况

解决方法: 1 打开配置管理器2左面点击sql服务3右面 右键点击SQL Server(MSSQLSERVER) 4点击 启动参数5 在参数 里输入  -T272 点增加 原文地址:https://www.cnblogs.com/superfeeling/p/11774417.html

函数指针,函数指针数组,函数返回值为函数指针

函数的名字就是函数的首地址:定义函数指针; int (*p)(int ) p为函数指针变量名字,int 为函数的返回值类型为int型:(int)为函数的形参类型为int型, 注:因为优先级所以要用(*p),否则就会p先和后面的()结合为int*p(int),意思就变为p(int)函数的返回值为int* 注:main2()函数中   int (*p[])(int ,int )  为一维数组,下面写错了, #include<stdio.h> #include<stdlib.h> int