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":"开料",& ...
随机推荐
- 10、scala面向对象编程之Trait
1. 将trait作为接口使用 2.trait中定义具体方法 3.trait定义具体字段 4.trait中定义抽象字段 5.为实例对象混入trait 6.trait调用链 7.在trait中覆盖抽象 ...
- 【sqli-labs】 less47 GET -Error based -String -Order By Clause(GET型基于错误的字符型Order By从句注入)
http://192.168.136.128/sqli-labs-master/Less-47/?sort=1 改变sort的值,结果仍然是order by 1的结果 http://192.168.1 ...
- Makefile精髓篇【转】
什么是makefile?或许非常多Winodws的程序猿都不知道这个东西,由于那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序猿,makefile还是 ...
- java数据类型和码表、转义字符
类型名称 字节空间 范围 整数型 byte 1 -27到27-1 或者 -128到127 short 2 -215到215-1 int 4 -231到231-1 long 8 ...
- Android组件化最佳实践 ARetrofit原理
ARetrofit原理讲原理之前,我想先说说为什么要ARetrofit.开发ARetrofit这个项目的思路来源其实是Retrofit,Retrofit是Square公司开发的一款针对Android网 ...
- Django - 数据获取
Django - 数据获取 1.radio值获取 2.checkbox获取 3.select 获取 select 获取值,需要根据前端multiple来获取,get or getlist; 4.上传文 ...
- 【http反向代理】多个域名指向同一个ip的不同网站解决方法
一个服务器需要挂载多个项目[重点是都能通过域名访问] 实现原理: 1.当前市面上看到的一些服务器,开放的端口一般都要求为 '80' 端口 所以80端口成了商用端口 2.域名的绑定是绑定一个一般是绑定你 ...
- C语言指针与指向指针的指针
#include <stdio.h> #include <string.h> int main() { char a[]="hello world"; ch ...
- Windows环境下flask+Apache+mod_wsgi部署及爬坑
文章目录 安装python Windows 环境使用virtualenv和virtualenvwrapper 安装mod_wsgi 安装nginx 安装Apache 遇到的坑 安装Apache遇到的坑 ...
- [LeetCode] 887. Super Egg Drop 超级鸡蛋掉落
You are given K eggs, and you have access to a building with N floors from 1 to N. Each egg is iden ...