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前台前面展示,

 

posted @ 2018-09-19 23:25  pcbren  阅读(989)  评论(0编辑  收藏  举报