PCB MS CLR 聚合函数 joinString加排序实现
准备着手,动态列SQL查询,要实现动态列SQL,会运用到聚合函数,而SQL本身聚合函数有限,
无满足此用户任意字段组合变化,再加上工艺流程重复相同工序,如;沉铜1,沉铜2对应工序代码都是相同的
而通常聚合以后,数据排列顺序失效,如果要实现,需采用低效的方式实现。
以其中一个:聚合函数joinString 为例说明,它是如何实现高效的
原来SQL实现:采用:FOR XML PATH ,比较低效,为了让效率高一点,需建立临时表,这样效率才稍好些,但这样实现比较呆呆的。
SELECT pdctno,techname,GlobalOrder INTO #ppeflow1
FROM [FP_EMS_DB].[dbo].[V_PPEFlow]
WHERE pdctno IN (SELECT pdctno FROM #EDS_StateCam) AND FlowLevel = 2 SELECT aa.pdctno
,(SELECT '' + bb.techname + '--' FROM #ppeflow1 bb where bb.pdctno = aa.pdctno ORDER BY bb.globalOrder FOR XML PATH('')) flowString
FROM #ppeflow1 aa
GROUP BY pdctno
更改后SQL实现:这样一看简洁多了。
SELECT pdctno,FP_EMSDB_PUB.dbo.JoinString(techname,'--',GlobalOrder) flowString
FROM [FP_EMS_DB].[dbo].[V_PPEFlow]
WHERE pdctno IN (
SELECT pdctno FROM #EDS_StateCam
) AND FlowLevel = 2
GROUP BY pdctno
SQL实现效果
net实现代码:
[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(
Format.UserDefined,
IsInvariantToDuplicates = false,
IsInvariantToNulls = true,
IsInvariantToOrder = false,
MaxByteSize = ,
Name = "JoinString")]
public struct UserJoinString : IBinarySerialize
{
private IList<stringOrder> ValueList;
private string JoinString_;
private string Separate_;
/// <summary>
/// 查询处理器使用此方法初始化聚合的计算
/// </summary>
public void Init()
{
ValueList = new List<stringOrder>();
Separate_ = "";
JoinString_ = "";
}
/// <summary>
/// 查询处理器使用此方法累计聚合值
/// </summary>
/// <param name="Value"></param>
public void Accumulate(SqlString Value, SqlString Separate,SqlInt32 Orderno) //
{
if (Separate_.Length == )
Separate_ = Separate.ToString();
ValueList.Add(new SQLClr.stringOrder() { orderno = (int)Orderno , itemstring =Value.ToString() });
} /// <summary>
/// 查询处理器使用此方法合并聚合的多个部分计算的值
/// </summary>
/// <param name="Group"></param>
public void Merge(UserJoinString Group) //无效 暂不用
{
//JoinString_.Append(Group.JoinString_ );
} /// <summary>
/// 此方法用于返回完成聚合计算的结果
/// </summary>
/// <returns></returns>
public SqlString Terminate()
{
return new SqlString(JoinString_); //
} /// <summary>
/// 读
/// </summary>
/// <param name="r"></param>
public void Read(System.IO.BinaryReader r) //
{
JoinString_ = r.ReadString();
Separate_ =r.ReadString();
} /// <summary>
/// 写
/// </summary>
/// <param name="w"></param>
public void Write(System.IO.BinaryWriter w) //
{
w.Write(string.Join(Separate_, ValueList.OrderBy(tt => tt.orderno).Select(tt => tt.itemstring).ToArray()));
w.Write(Separate_); }
} [Serializable]
public class stringOrder
{
public string itemstring { get; set; }
public int orderno { get; set; }
}
聚合函数创建SQL:
--第一步:先删函数
--第二步:再更新DLL
--第三步:再创建函数
IF EXISTS(SELECT* FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[JoinString]') AND type = N'AF')
DROP AGGREGATE[dbo].[JoinString] ALTER ASSEMBLY SQLfunctionAssembly
FROM 'D:\SQLClr.dll' --改为自己C#写的dll路径填写
WITH PERMISSION_SET = UNSAFE; CREATE AGGREGATE[dbo].[JoinString]
(@Value[nvarchar](4000), --聚合字符串
@Separate[nvarchar](20), --分隔符
@Orderno BIT --排序号
)
RETURNS[nvarchar](4000)
EXTERNAL NAME[SQLfunctionAssembly].[SQLClr.UserJoinString]
PCB MS CLR 聚合函数 joinString加排序实现的更多相关文章
- 【SQL】CLR聚合函数什么鬼
之前写过一个合并字符串的CLR聚合函数,基本是照抄MS的示例,外加了一些处理,已经投入使用很长时间,没什么问题也就没怎么研究,近日想改造一下,遇到一些问题,遂捣鼓一番,有些心得,记录如下. 一.杂项 ...
- PCB MS SQL CLR聚合函数(函数作用,调用顺序,调用次数) CLR说明
用CLR写函数:标量函数,表值函数 很好理解,如果用聚合函数则不是那么好理解了, 这里将CLR函数说明一下,其实关键是对聚合函数说明 用CLR写聚合函数关键点,是要理解CLR与SQL是如何进行数据交互 ...
- PCB MS SQL表值函数与CLR 表值函数 (例:字符串分割转表)
将字符串分割为表表经常用到,这里 SQL表值函数与CLR 表值函数,两种实现方法例出来如下: SELECT * FROM FP_EMSDB_PUB.dbo.SqlSplit('/','1oz/1.5 ...
- 聚合函数与SQL排序
聚合查询 通过SQL对数据进行某种操作或计算时需要使用函数(聚合函数,将多行汇为一行). 常用函数(5个): COUNT:计算表中的记录数(行数) SUM: 计算表中数值列中数据的合计值 AVG: 计 ...
- Hibernate的批量查询——Criteria查询所有、条件、分页、统计(聚合函数)、排序
1.查询所有的学生信息: public static void testSel() { Session session = HibernateUtils.openSession(); Transact ...
- PCB MS SQL 标量函数与表值函数(CLR) 实现文件与目录操作
一.C#写SQL SERVER(CLR)实现文件操作 标量函数: 文件移动 ,复制,检测文件存在,写入新文件文本,读取文本,创建目录,删除目录,检测目录是否存在 /// <summary> ...
- PCB MS SQL 标量函数(CLR) 实现Socket发送消息
在PCB业务系统中,数据库中的数据总是被应用端主动连接数据库并操作数据,是否想过可以让数据库主动的将数据推送出去呢! 答应其实是可以的.比如有这样的应用场景! 当SQL SERVER数据库满足某个条件 ...
- PCB MS SQL 标量函数(CLR) 实现DataTable转HTML的方法
一.准备需转为HMLT字符串的DataTable数据 在数据库中执行一段SQL返回的数据 需转换后的HTML的文本 <html ><head></head>< ...
- PCB MS SQL 标量函数(CLR) 实现DataTable转Json方法
一.准备需转为json字符串的DataTable数据 在数据库中执行一段SQL返回的数据 需转换后的JSON字符串的效果 [{"TechName":"开料",& ...
随机推荐
- 在Unity中对注册表的信息进行操作
问题1 在对注册表进行操作时无法生成注册表相关的类 解决办法: 增加头文件using Microsft.Win32; 问题2 在运行程序时报错同时注 ...
- 解读PTR_ERR,ERR_PTR,IS_ERR
解读PTR_ERR,ERR_PTR,IS_ERR 看到了几个宏PTR_ERR,ERR_PTR,IS_ERR(其实是内联函数).还是不太明白,然后就google搜索了一下,搜出来的结果真是不让人满意,看 ...
- swift--如何设置子视图alpha不同于父视图
//1.2加入商家标题评分容器 let titleWarp=UIView(frame: CGRectMake(, , screenObject.width, )); titleWarp.backgro ...
- uva-679 Dropping Balls UVA - 679
题目大意 总共有一个深度为D的满二叉树,I个小球,每个节点具有开关,小球经过节点后节点开关会有变化,初始都关闭,若关闭往左右否则往右走 只需要循环一下每层的情况即可 代码 #include <b ...
- 00.Python中下划线的5种含义
转自这里 先放上 简短的"速查表",罗列了五种Python下划线模式的含义: 模式 举例 含义 单前导下划线 _var 命名约定,仅供内部使用.通常不会由Python解释器强行执行 ...
- 熟悉RHEL7登录界面使用
Linux操作系统提供了图像界面和字符界面两种操作环境. 图像界面: 1.开启RHEL7后进入到该界面,图中用户是我们创建的本地用户,如果我们要以管理员身份登录则点击Not listed(未列出). ...
- CentOS与FreeBSD环境下安装filebeat
业务服务器CentOS与FreeBSD共存(痛苦囧...) CentOS rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch ...
- MySQL-----一对多
一对多: 用户表和部门表 用户: 用户id 用户名 部门 1 George 1 2 Elizabeth 1 3 Bruce 2 4 Catherine 3 部门: 部门id 部门名称 1 CEO ...
- git 的简单使用(3)
Git鼓励大量使用分支: 查看分支:git branch 创建分支:git branch <name> 切换分支:git checkout <name> 创建+切换分支:git ...
- PAT 1117 Eddington Number
British astronomer Eddington liked to ride a bike. It is said that in order to show off his skill, h ...