在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, );
int NoOrderno = ;
for (int i = ; i < bin2.Length; i++)
{
if (bin2[i] == '')
{
resultDataList.Add(new EnumData(NoOrderno, (int)Math.Pow(, bin2.Length - i - )));
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前台前面展示,

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

  1. SQL Server表分区的NULL值问题

    SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,但是本人觉得已经够用了 虽然MySQL支持四种分区类型:RANGE分区.LIST分区.HASH分区 ...

  2. SQL Server为字段添加默认值

    SQL Server为字段添加默认值 if not exists ( select * from sys.columns as c join sys.objects as o on c.default ...

  3. SQL Server 导入excel时“该值违反了该列的完整性约束”错误

    SQL Server 导入excel时“该值违反了该列的完整性约束”错误 这个问题看似高大上,仔细分析了一下,ID列怎么会有重复呢? 原来是有很多空行呀!!! 所以导入excel时一定要注意空行的问题 ...

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

    sql server 自增列,值突然增大1000的情况   解决方法: 1 打开配置管理器2左面点击sql服务3右面 右键点击SQL Server(MSSQLSERVER) 4点击 启动参数5 在参数 ...

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

    [源码下载] 速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函 ...

  6. PCB SQL SERVER 位运算应用实例

    在PCB行业,一个产品可能同时在多个工厂生产,举例:一个产品一条主记录,这条记录中会对应多个工厂的产地,而这个工厂产地个数不确定, 那么如何设计表结构存储这个不确定的工厂呢?这里想到了4个方式存储 一 ...

  7. PCB SQL SERVER 正则应用实例

    我们用过SQL SERVER的都知道,SQL SERVER它本身是不自带正则表达式的,因为没有,所以基本都没用过啊, 但我们在C#中对文本匹配用正则的方式处理非常好用,省得你写一堆代码实现匹配,多简洁 ...

  8. SQL中一种类似GUID值的函数实现

        开发中会需要用到多列值组合成一个ID值的情况.比如做数据清洗的时候,一张表A有五列,分别是医院.科室.医生.职称.电话.面有许多重复的数据需要和另一个表B(和A列相同)做对比.清洗需要做两件事 ...

  9. SQL Server进阶(十二)常用函数

    在SQL 2012基础教程中列出子句是按照以下顺序进行逻辑处理. FROM WHERE GROUP BY HAVING SELECT ORDER BY FROM TableName WHERE Use ...

随机推荐

  1. xmpp 消息和好友上下线(3)

    原始地址:XMPPFrameWork IOS 开发(四) 消息 //收到消息 - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XM ...

  2. ZOJ - 3992 - One-Dimensional Maze (思维)

    题意: 一条长度为n的直线,你一开始在位置m上 其中每个整点都有一个字符'L'或'R',如果是'L'那么你必须往左走一步,否则往右走一步 如果你到达位置1或位置n你任务就完成了 不过有可能你永远到不了 ...

  3. 如何防止XshellPortable、putty、SecureCRT等断网造成Linux命令中断

    在使用XshellPortable.putty.SecureCRT等工具远程连接Linux系统时,如果我们执行了一大堆命令,在命令尚未执行完毕,客户端突然断网或者XshellPortable.putt ...

  4. 基于python、jupyter-notebook 的金融领域用户交易行为分析

    说明:本文重在说明交易数据统计.分析方法,所有数据均为生成的数据 时间原因代码未定义成函数 统计指标:1.用户单日交易行为数据 2.按小时为计算单位,统计用户行为数据(旨在求得一天24小时中每个小时的 ...

  5. top Universities in Mechanical Engineering

  6. Educational Codeforces Round 41 D. Pair Of Lines(961D)

    [题意概述] 给出平面上的10W个点,要求判断这些点能否被两条直线穿过,即一个点至少在一条直线上. [题解] 思路很快可以想到.取3个不共线的点,它们形成一个三角形:如果有解,其中的一条直线一定与三角 ...

  7. CodeForcesGym 100753E Change of Scenery

    Change of Scenery Time Limit: 10000ms Memory Limit: 262144KB This problem will be judged on CodeForc ...

  8. BNUOJ 26224 Covered Walkway

    Covered Walkway Time Limit: 10000ms Memory Limit: 131072KB This problem will be judged on HDU. Origi ...

  9. GUI 总结(一)

    一/概述 1.两个包: javax.awt //before java 1.2 javax.swing //after java 1.2 2.两个词: 组件Component 容器Container ...

  10. MySQL Workbench查看和修改表字段的Comment值

    查看: 选择单个表->[右键]->[Table Inspector] 再选择Columns选项卡即可,把表格拉倒最后一列. 编辑: 选择单个表->[右键]->[Alter Ta ...