在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. C++ Error C2662 cannot convert 'this' pointer from 'const *'

    ---恢复内容开始--- 这个错误在于一点:常量对象只能调用常量成员(函数\变量),不能调用非常量成员.另一方面,非常量对象,既可以调用常量成员,又可以调用非常量成员. class A { publi ...

  2. Luogu P3110 [USACO14DEC]驮运Piggy Back

    解题思路 看到下面很多人都在说什么遇到了之后要不要背着走,其实根本不需要,同样的我也是跑了三遍$SPFA$,求出了以$1$为起点到个点的$dist$,和以$2$为起点到个点的$dist$,还有以$n$ ...

  3. [Algorithm] 11. Linked List Cycle

    Description Given a linked list, determine if it has a cycle in it. To represent a cycle in the give ...

  4. Linux学习笔记记录(补充)

  5. Yii 时间日期组件与composer 下载中出现的问题

    首先本篇主要讲3点 一个Yii时间日期组件的两种用法 笔者使用composer下载该组件时出现问题的解决办法 1.composer下载出现的问题 file could not be downloade ...

  6. Ubuntu16.04安装rabbitmq(实战)

    安装Erlang 由于RabbitMQ需要基于Erlang/OTP,所以在安装RabbitMQ之前需要先安装Erlang/OTP.同样的,在Ubuntu标准的repositories中,Erlang/ ...

  7. A^B Mod C

    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出3个正整数A B C,求A^B Mod C.   例如,3 5 8,3^5 Mod 8 = 3. Input 3个正整 ...

  8. ORA-12541:TNS:无监听程序

    安装oracle以后,sql plus可以正常登陆,pl/sql登陆时报错ORA-12541:TNS:无监听程序,解决方案如下: http://blog.csdn.net/hao134838/arti ...

  9. 转载 字符串hash

    转载自:http://www.cnblogs.com/jiu0821/p/4554352.html 求一个字符串的hash值: •现在我们希望找到一个hash函数,使得每一个字符串都能够映射到一个整数 ...

  10. codevs——1517 求一次函数解析式

    1517 求一次函数解析式  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver 题解       题目描述 Description 相信大家都做过练习册上的这种 ...