zoukankan      html  css  js  c++  java
  • 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前台前面展示,

  • 相关阅读:
    三十四:布局之混合布局、圣杯布局、双飞翼布局
    三十三:布局之经典的列布局
    三十二:布局之经典的行布局
    三十一:CSS之CSS定位之position
    三十:CSS之用浮动实现网页的导航和布局
    二十九:CSS之浮动float
    二十八:CSS之列表list-type
    二十七:CSS之背景background
    二十六:CSS之盒子模型之小案例
    二十五:CSS之盒子模型之display属性
  • 原文地址:https://www.cnblogs.com/pcbren/p/9678329.html
Copyright © 2011-2022 走看看