准备着手,动态列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加排序实现的更多相关文章

  1. 【SQL】CLR聚合函数什么鬼

    之前写过一个合并字符串的CLR聚合函数,基本是照抄MS的示例,外加了一些处理,已经投入使用很长时间,没什么问题也就没怎么研究,近日想改造一下,遇到一些问题,遂捣鼓一番,有些心得,记录如下. 一.杂项 ...

  2. PCB MS SQL CLR聚合函数(函数作用,调用顺序,调用次数) CLR说明

    用CLR写函数:标量函数,表值函数 很好理解,如果用聚合函数则不是那么好理解了, 这里将CLR函数说明一下,其实关键是对聚合函数说明 用CLR写聚合函数关键点,是要理解CLR与SQL是如何进行数据交互 ...

  3. PCB MS SQL表值函数与CLR 表值函数 (例:字符串分割转表)

    将字符串分割为表表经常用到,这里 SQL表值函数与CLR  表值函数,两种实现方法例出来如下: SELECT * FROM FP_EMSDB_PUB.dbo.SqlSplit('/','1oz/1.5 ...

  4. 聚合函数与SQL排序

    聚合查询 通过SQL对数据进行某种操作或计算时需要使用函数(聚合函数,将多行汇为一行). 常用函数(5个): COUNT:计算表中的记录数(行数) SUM: 计算表中数值列中数据的合计值 AVG: 计 ...

  5. Hibernate的批量查询——Criteria查询所有、条件、分页、统计(聚合函数)、排序

    1.查询所有的学生信息: public static void testSel() { Session session = HibernateUtils.openSession(); Transact ...

  6. PCB MS SQL 标量函数与表值函数(CLR) 实现文件与目录操作

    一.C#写SQL SERVER(CLR)实现文件操作 标量函数: 文件移动 ,复制,检测文件存在,写入新文件文本,读取文本,创建目录,删除目录,检测目录是否存在 /// <summary> ...

  7. PCB MS SQL 标量函数(CLR) 实现Socket发送消息

    在PCB业务系统中,数据库中的数据总是被应用端主动连接数据库并操作数据,是否想过可以让数据库主动的将数据推送出去呢! 答应其实是可以的.比如有这样的应用场景! 当SQL SERVER数据库满足某个条件 ...

  8. PCB MS SQL 标量函数(CLR) 实现DataTable转HTML的方法

    一.准备需转为HMLT字符串的DataTable数据 在数据库中执行一段SQL返回的数据 需转换后的HTML的文本 <html ><head></head>< ...

  9. PCB MS SQL 标量函数(CLR) 实现DataTable转Json方法

    一.准备需转为json字符串的DataTable数据 在数据库中执行一段SQL返回的数据 需转换后的JSON字符串的效果 [{"TechName":"开料",& ...

随机推荐

  1. VHDL_ADC之cic_diffcell

    library IEEE; use ieee.std_logic_1164.all; use ieee.numeric_std.all; library edclib; use edclib.pkg_ ...

  2. img图片加载出错处理

    img图片加载出错处理   为了美观当网页图片不存在时不显示叉叉图片 当在页面显示的时候,万一图片被移动了位置或者丢失的话,将会在页面显示一个带X的图片,很是影响用户的体验.即使使用alt属性给出了” ...

  3. JpGraph 画图

    1:借鉴地址 PHP jpgraph安装及基本用法 http://www.php.cn/php-weizijiaocheng-400977.html JpGraph使用详解之中文乱码解决方法 http ...

  4. CAD调用导角命令,并返回导角的圆弧对象

    主要用到函数说明: _DMxDrawX::SendStringToExecuteFun 把命令当着函数执行,可以传参数,详细说明如下: 参数 说明 IDispatch* pParam 命令参数,IMx ...

  5. react typescript 子组件调用父组件

    //父组件 import * as React from 'react'import { Input } from 'antd'const Search = Input.Searchimport &q ...

  6. (C/C++学习)13.C语言字符串处理函数(一)

    说明:字符串处理的函数很多,本文将例举经常遇到的一些函数加以说明. 一.字符串的输入输出 头文件:<stdio.h> 1.利用标准输出函数 printf() 来输出,将格式设置为 s% . ...

  7. [POJ2104] 区间第k大数 [区间第k大数,可持久化线段树模板题]

    可持久化线段树模板题. #include <iostream> #include <algorithm> #include <cstdio> #include &l ...

  8. R语言为数据框添加列名或行名

    1.添加列名 wts=c(1,1,1) names(wts)=c("setosa","versicolor","virginica") 2. ...

  9. nyoj_66_分数拆分_201312012122

    分数拆分 时间限制:3000 ms  |           内存限制:65535 KB 难度:1   描述 现在输入一个正整数k,找到所有的正整数x>=y,使得1/k=1/x+1/y.   输 ...

  10. hdu_1038_Biker's Trip Odometer_201311021643

    Biker's Trip Odometer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...