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前台前面展示,
作者:pcbren 微信号:yadnfku QQ号: 254566449
博客地址:https://www.cnblogs.com/pcbren/
声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。
如果大家感觉我的博文对大家有帮助,请推荐支持一把。