PCB MS SQL 存储过程(CLR) 实现Json转DataTable表的方法
一.准备需转为DataTable的json字符串
原json字符串数据
- [{"TechName":"ECN","TechNo":"EC_01","id":"1"},{"TechName":"流程指示","TechNo":"PI_01","id":"2"},{"TechName":"计划投料","TechNo":"FP_01","id":"3"},{"TechName":"开料","TechNo":"CC_01","id":"4"},{"TechName":"裁切","TechNo":"CC_02","id":"5"},{"TechName":"磨边","TechNo":"CC_03","id":"6"},{"TechName":"圆角","TechNo":"CC_04","id":"7"},{"TechName":"打标","TechNo":"CC_05","id":"8"},{"TechName":"烘板","TechNo":"CC_06","id":"9"},{"TechName":"钻孔","TechNo":"MD_02","id":"10"},{"TechName":"去毛刺","TechNo":"PT_01","id":"11"},{"TechName":"烘板","TechNo":"PT_05","id":"12"},{"TechName":"等离子处理","TechNo":"PT_02","id":"13"},{"TechName":"沉铜","TechNo":"PT_07","id":"14"},{"TechName":"负片电镀","TechNo":"PP_02","id":"15"},{"TechName":"磨板","TechNo":"PP_05","id":"16"},{"TechName":"外层前处理","TechNo":"OL_01","id":"17"},{"TechName":"贴膜","TechNo":"OL_03","id":"18"},{"TechName":"曝光","TechNo":"OL_04","id":"19"},{"TechName":"显影","TechNo":"OL_05","id":"20"},{"TechName":"酸性蚀刻","TechNo":"OL_06","id":"21"},{"TechName":"退膜","TechNo":"OL_07","id":"22"},{"TechName":"外层AOI","TechNo":"AO_04","id":"23"},{"TechName":"烘板","TechNo":"SM_02","id":"24"},{"TechName":"阻焊前处理","TechNo":"SM_01","id":"25"},{"TechName":"丝印","TechNo":"SM_05","id":"26"},{"TechName":"阻焊前处理","TechNo":"SM_01","id":"27"},{"TechName":"丝印","TechNo":"SM_05","id":"28"},{"TechName":"预烘","TechNo":"SM_06","id":"29"},{"TechName":"曝光","TechNo":"SM_09","id":"30"},{"TechName":"显影","TechNo":"SM_10","id":"31"},{"TechName":"终固化","TechNo":"SM_11","id":"32"},{"TechName":"喷砂","TechNo":"EN_01","id":"33"},{"TechName":"板边包胶","TechNo":"EN_02","id":"34"},{"TechName":"沉金","TechNo":"EN_04","id":"35"},{"TechName":"水洗烘干","TechNo":"EN_06","id":"36"},{"TechName":"铣板","TechNo":"FO_02","id":"37"},{"TechName":"成品清洗","TechNo":"FO_14","id":"38"},{"TechName":"小板切割","TechNo":"FO_08","id":"39"},{"TechName":"功能检查","TechNo":"FI_01","id":"40"},{"TechName":"外观检查","TechNo":"FI_02","id":"41"},{"TechName":"内包装","TechNo":"PK_01","id":"42"},{"TechName":"入库","TechNo":"DE_01","id":"43"},{"TechName":"外包装","TechNo":"DE_02","id":"44"},{"TechName":"出库","TechNo":"DE_03","id":"45"}] '
转换后的效果(横向)
转换后的效果(竖向)
二.C#写SQL SERVER(CLR) json转DataTable存储过程
利用Json反序列化为字典类型 Dictionary<string, object> key,value形式,然后再转为DataTable
- /// <summary>
- /// Json转Table
- /// </summary>
- /// <param name="jsonString"></param>
- /// <param name="isVerticalTable">是否竖表</param>
- [Microsoft.SqlServer.Server.SqlProcedure]
- public static void Json2Table(string jsonString, bool isVerticalTable)
- {
- SqlDataRecord dataRecord = new SqlDataRecord();
- var ListObject = Json.Deserialize(jsonString) as List<object>;
- var Object = Json.Deserialize(jsonString) as Dictionary<string, object>;
- if (ListObject == null && Object == null)
- return;
- if (ListObject == null)
- {
- ListObject = new List<object>();
- ListObject.Add(Object);
- }
- List<SqlMetaData> sqlMetaDatas = new List<SqlMetaData>();
- Dictionary<string, object> KeyObject = (Dictionary<string, object>)ListObject[];
- if (!isVerticalTable)
- {
- foreach (var jProperty in KeyObject)
- {
- sqlMetaDatas.Add(new SqlMetaData(jProperty.Key, SqlDbType.NVarChar, ));
- }
- dataRecord = new SqlDataRecord(sqlMetaDatas.ToArray());
- SqlContext.Pipe.SendResultsStart(dataRecord);
- for (int i = ; i < ListObject.Count(); i++)
- {
- Dictionary<string, object> DicObject = (Dictionary<string, object>)ListObject[i];
- int j = ;
- foreach (var item in KeyObject)
- {
- dataRecord.SetString(j, DicObject[item.Key].ToStringJson());
- j++;
- }
- SqlContext.Pipe.SendResultsRow(dataRecord);
- }
- SqlContext.Pipe.SendResultsEnd();
- }
- else
- {
- dataRecord = new SqlDataRecord(new SqlMetaData[] { new SqlMetaData("id", SqlDbType.Int), new SqlMetaData("key", SqlDbType.NVarChar, ), new SqlMetaData("value", SqlDbType.NVarChar, ) });
- SqlContext.Pipe.SendResultsStart(dataRecord);
- for (int i = ; i < ListObject.Count(); i++)
- {
- Dictionary<string, object> DicObject = (Dictionary<string, object>)ListObject[i];
- foreach (var item in DicObject)
- {
- dataRecord.SetInt32(, i + );
- dataRecord.SetString(, item.Key.ToString());
- dataRecord.SetString(, item.Value.ToStringJson());
- SqlContext.Pipe.SendResultsRow(dataRecord);
- }
- }
- SqlContext.Pipe.SendResultsEnd();
- }
- SqlContext.Pipe.Send("ok");
- }
- public static class StaticMethod
- {
- public static string ToStringJson(this object thisObject)
- {
- if (thisObject == null)
- return "";
- if (thisObject is Dictionary<string,object>)
- return Json.Serialize(thisObject);
- else if (thisObject is List<object>)
- return Json.Serialize(thisObject);
- return thisObject.ToString();
- }
- }
开源MiniJSON类解析Json字符串
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Text;
- namespace SQLClr
- {
- /// <summary>
- /// This class encodes and decodes JSON strings.
- /// Spec. details, see http://www.json.org/
- ///
- /// JSON uses Arrays and Objects. These correspond here to the datatypes IList and IDictionary.
- /// All numbers are parsed to doubles.
- /// </summary>
- public static class Json
- {
- /// <summary>
- /// Parses the string json into a value
- /// </summary>
- /// <param name="json">A JSON string.</param>
- /// <returns>An List<object>, a Dictionary<string, object>, a double, an integer,a string, null, true, or false</returns>
- //反序列化
- public static object Deserialize(string json)
- {
- // save the string for debug information
- if (json == null)
- {
- return null;
- }
- return Parser.Parse(json);
- }
- //阻止其他类从该类继承
- sealed class Parser : IDisposable
- {
- const string WORD_BREAK = "{}[],:\"";
- public static bool IsWordBreak(char c)
- {
- // 如果 c 是空白,则为 true;否则,为 false;报告指定 Unicode 字符在此字符串中的第一个匹配项的索引。
- return Char.IsWhiteSpace(c) || WORD_BREAK.IndexOf(c) != -;
- }
- enum TOKEN
- {
- NONE,
- CURLY_OPEN,
- CURLY_CLOSE,
- SQUARED_OPEN,
- SQUARED_CLOSE,
- COLON,
- COMMA,
- STRING,
- NUMBER,
- TRUE,
- FALSE,
- NULL
- };
- // 实现从字符串进行读取的 System.IO.TextReader。
- StringReader json;
- Parser(string jsonString)
- {
- json = new StringReader(jsonString);
- }
- public static object Parse(string jsonString)
- {
- using (var instance = new Parser(jsonString))
- {
- return instance.ParseValue();
- }
- }
- //释放
- public void Dispose()
- {
- json.Dispose();
- json = null;
- }
- Dictionary<string, object> ParseObject()
- {
- Dictionary<string, object> table = new Dictionary<string, object>();
- // ditch opening brace
- json.Read();
- // {
- while (true)
- {
- switch (NextToken)
- {
- case TOKEN.NONE:
- return null;
- case TOKEN.COMMA:
- continue;
- case TOKEN.CURLY_CLOSE:
- return table;
- default:
- // name
- string name = ParseString();
- if (name == null)
- {
- return null;
- }
- // :
- if (NextToken != TOKEN.COLON)
- {
- return null;
- }
- // ditch the colon
- json.Read();
- // value
- table[name] = ParseValue();
- break;
- }
- }
- }
- List<object> ParseArray()
- {
- List<object> array = new List<object>();
- // ditch opening bracket
- json.Read();
- // [
- bool parsing = true;
- while (parsing)
- {
- TOKEN nextToken = NextToken;
- switch (nextToken)
- {
- case TOKEN.NONE:
- return null;
- case TOKEN.COMMA:
- continue;
- case TOKEN.SQUARED_CLOSE:
- parsing = false;
- break;
- default:
- object value = ParseByToken(nextToken);
- array.Add(value);
- break;
- }
- }
- return array;
- }
- object ParseValue()
- {
- TOKEN nextToken = NextToken;
- return ParseByToken(nextToken);
- }
- object ParseByToken(TOKEN token)
- {
- switch (token)
- {
- case TOKEN.STRING:
- return ParseString();
- case TOKEN.NUMBER:
- return ParseNumber();
- case TOKEN.CURLY_OPEN:
- return ParseObject();
- case TOKEN.SQUARED_OPEN:
- return ParseArray();
- case TOKEN.TRUE:
- return true;
- case TOKEN.FALSE:
- return false;
- case TOKEN.NULL:
- return null;
- default:
- return null;
- }
- }
- string ParseString()
- {
- StringBuilder s = new StringBuilder();
- char c;
- // ditch opening quote
- json.Read();
- bool parsing = true;
- while (parsing)
- {
- if (json.Peek() == -)
- {
- parsing = false;
- break;
- }
- c = NextChar;
- switch (c)
- {
- case '"':
- parsing = false;
- break;
- case '\\':
- if (json.Peek() == -)
- {
- parsing = false;
- break;
- }
- c = NextChar;
- switch (c)
- {
- case '"':
- case '\\':
- case '/':
- s.Append(c);
- break;
- case 'b':
- s.Append('\b');
- break;
- case 'f':
- s.Append('\f');
- break;
- case 'n':
- s.Append('\n');
- break;
- case 'r':
- s.Append('\r');
- break;
- case 't':
- s.Append('\t');
- break;
- case 'u':
- var hex = new char[];
- for (int i = ; i < ; i++)
- {
- hex[i] = NextChar;
- }
- s.Append((char)Convert.ToInt32(new string(hex), ));
- break;
- }
- break;
- default:
- s.Append(c);
- break;
- }
- }
- return s.ToString();
- }
- object ParseNumber()
- {
- string number = NextWord;
- // 摘要:
- // 报告指定 Unicode 字符在此字符串中的第一个匹配项的索引。
- //
- // 参数:
- // value:
- // 要查找的 Unicode 字符。
- //
- // 返回结果:
- // 如果找到该字符,则为 value 的从零开始的索引位置;如果未找到,则为 -1。
- if (number.IndexOf('.') == -)
- {
- long parsedInt;
- // 将数字的字符串表示形式转换为它的等效 64 位有符号整数。一个指示转换是否成功的返回值。
- Int64.TryParse(number, out parsedInt);
- return parsedInt;
- }
- double parsedDouble;
- Double.TryParse(number, out parsedDouble);
- return parsedDouble;
- }
- //
- void EatWhitespace()
- {
- //指示指定字符串中位于指定位置处的字符是否属于空白类别。
- while (Char.IsWhiteSpace(PeekChar))
- {
- json.Read();
- //摘要:
- // 返回下一个可用的字符,但不使用它。
- //
- // 返回结果:
- // 表示下一个要读取的字符的整数,或者,如果没有更多的可用字符或该流不支持查找,则为 -1。
- if (json.Peek() == -)
- {
- break;
- }
- }
- }
- char PeekChar
- {
- get
- {
- // 读取输入字符串中的下一个字符并将该字符的位置提升一个字符。
- //
- // 返回结果:
- // 基础字符串中的下一个字符,或者如果没有更多的可用字符,则为 -1。
- return Convert.ToChar(json.Peek());
- }
- }
- char NextChar
- {
- get
- {
- return Convert.ToChar(json.Read());
- }
- }
- string NextWord
- {
- get
- {
- // 表示可变字符字符串。无法继承此类。
- StringBuilder word = new StringBuilder();
- while (!IsWordBreak(PeekChar))
- {
- // 摘要:
- // 在此实例的结尾追加指定 Unicode 字符的字符串表示形式。
- //
- // 参数:
- // value:
- // 要追加的 Unicode 字符。
- //
- // 返回结果:
- // 完成追加操作后对此实例的引用。
- word.Append(NextChar);
- //下一个字符为空
- if (json.Peek() == -)
- {
- break;
- }
- }
- //
- return word.ToString();
- }
- }
- TOKEN NextToken
- {
- get
- {
- EatWhitespace();
- if (json.Peek() == -)
- {
- return TOKEN.NONE;
- }
- switch (PeekChar)
- {
- case '{':
- return TOKEN.CURLY_OPEN;
- case '}':
- json.Read();
- return TOKEN.CURLY_CLOSE;
- case '[':
- return TOKEN.SQUARED_OPEN;
- case ']':
- json.Read();
- return TOKEN.SQUARED_CLOSE;
- case ',':
- json.Read();
- return TOKEN.COMMA;
- case '"':
- return TOKEN.STRING;
- case ':':
- return TOKEN.COLON;
- case '':
- case '':
- case '':
- case '':
- case '':
- case '':
- case '':
- case '':
- case '':
- case '':
- case '-':
- return TOKEN.NUMBER;
- }
- switch (NextWord)
- {
- case "false":
- return TOKEN.FALSE;
- case "true":
- return TOKEN.TRUE;
- case "null":
- return TOKEN.NULL;
- }
- return TOKEN.NONE;
- }
- }
- }
- /// <summary>
- /// Converts a IDictionary / IList object or a simple type (string, int, etc.) into a JSON string
- /// </summary>
- /// <param name="json">A Dictionary<string, object> / List<object></param>
- /// <returns>A JSON encoded string, or null if object 'json' is not serializable</returns>
- public static string Serialize(object obj)
- {
- return Serializer.Serialize(obj);
- }
- sealed class Serializer
- {
- StringBuilder builder;
- Serializer()
- {
- //创建生成器
- builder = new StringBuilder();
- }
- //序列化
- public static string Serialize(object obj)
- {
- var instance = new Serializer();
- instance.SerializeValue(obj);
- return instance.builder.ToString();
- }
- //类型
- void SerializeValue(object value)
- {
- IList asList;
- IDictionary asDict;
- string asStr;
- if (value == null)
- {
- builder.Append("null");
- }
- else if ((asStr = value as string) != null)
- {
- SerializeString(asStr);
- }
- else if (value is bool)
- {
- builder.Append((bool)value ? "true" : "false");
- }
- else if ((asList = value as IList) != null)
- {
- SerializeArray(asList);
- }
- else if ((asDict = value as IDictionary) != null)
- {
- SerializeObject(asDict);
- }
- else if (value is char)
- {
- SerializeString(new string((char)value, ));
- }
- else
- {
- SerializeOther(value);
- }
- }
- //序列化对象
- void SerializeObject(IDictionary obj)
- {
- bool first = true;
- builder.Append('{');
- foreach (object e in obj.Keys)
- {
- if (!first)
- {
- builder.Append(',');
- }
- SerializeString(e.ToString());
- builder.Append(':');
- SerializeValue(obj[e]);
- first = false;
- }
- builder.Append('}');
- }
- // 序列化数组
- void SerializeArray(IList anArray)
- {
- builder.Append('[');
- bool first = true;
- foreach (object obj in anArray)
- {
- if (!first)
- {
- builder.Append(',');
- }
- SerializeValue(obj);
- first = false;
- }
- builder.Append(']');
- }
- //string
- void SerializeString(string str)
- {
- builder.Append('\"');
- char[] charArray = str.ToCharArray();
- foreach (var c in charArray)
- {
- switch (c)
- {
- case '"':
- builder.Append("\\\"");
- break;
- case '\\':
- builder.Append("\\\\");
- break;
- case '\b':
- builder.Append("\\b");
- break;
- case '\f':
- builder.Append("\\f");
- break;
- case '\n':
- builder.Append("\\n");
- break;
- case '\r':
- builder.Append("\\r");
- break;
- case '\t':
- builder.Append("\\t");
- break;
- default:
- int codepoint = Convert.ToInt32(c);
- if ((codepoint >= ) && (codepoint <= ))
- {
- builder.Append(c);
- }
- else
- {
- //builder.Append("\\u");
- //builder.Append(codepoint.ToString("x4"));
- builder.Append(c);
- }
- break;
- }
- }
- builder.Append('\"');
- }
- //其他
- void SerializeOther(object value)
- {
- // NOTE: decimals lose precision during serialization.
- // They always have, I'm just letting you know.
- // Previously floats and doubles lost precision too.
- //注意:小数在序列化过程中丢失精度。
- //他们总是有,我只是让你知道。
- //以前失去精度和双精度浮点数。
- if (value is float)
- {
- builder.Append(((float)value).ToString("R"));
- }
- else if (value is int
- || value is uint
- || value is long
- || value is sbyte
- || value is byte
- || value is short
- || value is ushort
- || value is ulong)
- {
- builder.Append(value);
- }
- else if (value is double
- || value is decimal)
- {
- builder.Append(Convert.ToDouble(value).ToString("R"));
- }
- else
- {
- SerializeString(value.ToString());
- }
- }
- }
- }
- }
三.SQL服务器CLR配置(允许SQL调用.net程序)
- sp_configure 'show advanced options', 1;
- RECONFIGURE WITH override
- GO
- sp_configure 'clr enabled', 1;
- RECONFIGURE WITH override
- GO
- Sp_changedbowner 'sa',true --sa改为当前登入用户名
- alter database [dbname] set trustworthy on --bbname 改为自己的库名
四.注册 CLR 程序集
- create ASSEMBLY SQLfunctionAssembly
- FROM 'D:\SQLClr.dll' --改为自己C#写的dll路径填写
- WITH PERMISSION_SET = UNSAFE;
创建的.net程序集数据会写入下表:
- select * from sys.assemblies
- select * from sys.assembly_files
五.创建存储过程
- CREATE PROCEDURE[dbo].[Json2Table] (
- @jsonString NVARCHAR(max),
- @isVerticalTable bit
- )
- WITH EXECUTE AS CALLER
- AS
- EXTERNAL NAME [SQLfunctionAssembly].[SQLClr.SQLfunction].[Json2Table] --[SQL程序集名].[命名空间.类名].[方法名]
六.测试Json转DataTable存储过程
- DECLARE @jsonString VARCHAR(MAX)
- SET @jsonString = '
- [{"TechName":"ECN","TechNo":"EC_01","id":"1"},{"TechName":"流程指示","TechNo":"PI_01","id":"2"},{"TechName":"计划投料","TechNo":"FP_01","id":"3"},{"TechName":"开料","TechNo":"CC_01","id":"4"},{"TechName":"裁切","TechNo":"CC_02","id":"5"},{"TechName":"磨边","TechNo":"CC_03","id":"6"},{"TechName":"圆角","TechNo":"CC_04","id":"7"},{"TechName":"打标","TechNo":"CC_05","id":"8"},{"TechName":"烘板","TechNo":"CC_06","id":"9"},{"TechName":"钻孔","TechNo":"MD_02","id":"10"},{"TechName":"去毛刺","TechNo":"PT_01","id":"11"},{"TechName":"烘板","TechNo":"PT_05","id":"12"},{"TechName":"等离子处理","TechNo":"PT_02","id":"13"},{"TechName":"沉铜","TechNo":"PT_07","id":"14"},{"TechName":"负片电镀","TechNo":"PP_02","id":"15"},{"TechName":"磨板","TechNo":"PP_05","id":"16"},{"TechName":"外层前处理","TechNo":"OL_01","id":"17"},{"TechName":"贴膜","TechNo":"OL_03","id":"18"},{"TechName":"曝光","TechNo":"OL_04","id":"19"},{"TechName":"显影","TechNo":"OL_05","id":"20"},{"TechName":"酸性蚀刻","TechNo":"OL_06","id":"21"},{"TechName":"退膜","TechNo":"OL_07","id":"22"},{"TechName":"外层AOI","TechNo":"AO_04","id":"23"},{"TechName":"烘板","TechNo":"SM_02","id":"24"},{"TechName":"阻焊前处理","TechNo":"SM_01","id":"25"},{"TechName":"丝印","TechNo":"SM_05","id":"26"},{"TechName":"阻焊前处理","TechNo":"SM_01","id":"27"},{"TechName":"丝印","TechNo":"SM_05","id":"28"},{"TechName":"预烘","TechNo":"SM_06","id":"29"},{"TechName":"曝光","TechNo":"SM_09","id":"30"},{"TechName":"显影","TechNo":"SM_10","id":"31"},{"TechName":"终固化","TechNo":"SM_11","id":"32"},{"TechName":"喷砂","TechNo":"EN_01","id":"33"},{"TechName":"板边包胶","TechNo":"EN_02","id":"34"},{"TechName":"沉金","TechNo":"EN_04","id":"35"},{"TechName":"水洗烘干","TechNo":"EN_06","id":"36"},{"TechName":"铣板","TechNo":"FO_02","id":"37"},{"TechName":"成品清洗","TechNo":"FO_14","id":"38"},{"TechName":"小板切割","TechNo":"FO_08","id":"39"},{"TechName":"功能检查","TechNo":"FI_01","id":"40"},{"TechName":"外观检查","TechNo":"FI_02","id":"41"},{"TechName":"内包装","TechNo":"PK_01","id":"42"},{"TechName":"入库","TechNo":"DE_01","id":"43"},{"TechName":"外包装","TechNo":"DE_02","id":"44"},{"TechName":"出库","TechNo":"DE_03","id":"45"}] '
- exec dbo.Json2Table @jsonString,0 --0转横表 1转竖表
运行后结果(转横表)
运行后结果(转竖表)
PCB MS SQL 存储过程(CLR) 实现Json转DataTable表的方法的更多相关文章
- PCB MS SQL 标量函数(CLR) 实现DataTable转Json方法
一.准备需转为json字符串的DataTable数据 在数据库中执行一段SQL返回的数据 需转换后的JSON字符串的效果 [{"TechName":"开料",& ...
- PCB MS SQL 排序应用---SQL相邻数据区间值求解
其中一篇 博文中有写<PCB MS SQL 排序应用---相邻数据且相同合并处理>此篇有也应相用也同的技巧,实现相邻数据区间值求解 示例: 原数据:处理前 求出区间值:处理后 SQL 代码 ...
- PCB MS SQL 标量函数(CLR) 实现Socket发送消息
在PCB业务系统中,数据库中的数据总是被应用端主动连接数据库并操作数据,是否想过可以让数据库主动的将数据推送出去呢! 答应其实是可以的.比如有这样的应用场景! 当SQL SERVER数据库满足某个条件 ...
- PCB MS SQL 标量函数与表值函数(CLR) 实现文件与目录操作
一.C#写SQL SERVER(CLR)实现文件操作 标量函数: 文件移动 ,复制,检测文件存在,写入新文件文本,读取文本,创建目录,删除目录,检测目录是否存在 /// <summary> ...
- PCB MS SQL 标量函数(CLR) 实现DataTable转HTML的方法
一.准备需转为HMLT字符串的DataTable数据 在数据库中执行一段SQL返回的数据 需转换后的HTML的文本 <html ><head></head>< ...
- json转datatable(正则表达式的方法)
/// <summary> /// 将json转换为DataTable /// </summary> /// <param name="strJson" ...
- 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 ...
- PCB MS SQL SERVER版本管控工具source_safe_for_sql_server
PCB由于业务关系复杂,业务触发一个事件时,可能需与数据库多个表进行关连处理才能拿到数据结果, 而表关连并不是简单的关连,实际是要进行大量数据筛选,逻辑判断,转换等过程...这个过程是复杂的 想一想, ...
随机推荐
- git 的 基础操作及使用
/* git svn版本控制器 */ /*git把文件对应的储存空间分为三个区: 1.工作区 2.缓存区 3.历史区 直接操作文件,不做add时,咱们是在工作区做的修改 右键 git bash her ...
- 在Eclipse中设置Maven插件
[步骤] Maven插件的设置: ①installations:指定Maven核心程序的位置.不建议使用Maven插件自带的Maven程序,而应该使用我们自己解压的那个. ②user settings ...
- 【Codeforces 159B】Matchmaker
[链接] 我是链接,点我呀:) [题意] 笔和笔盖 笔有颜色和直径 笔盖也有颜色和直径 笔盖和笔如果直径相等 那么称为good 如果笔盖和笔直径相等.颜色也相等,那么称为very good 问你怎样安 ...
- 【Codeforces 1037D】Valid BFS?
[链接] 我是链接,点我呀:) [题意] 让你判断一个序列是否可能为一个bfs的序列 [题解] 先dfs出来每一层有多少个点,以及每个点是属于哪一层的. 每一层的bfs如果有先后顺序的话,下一层的节点 ...
- print pdf bug & DOCTYPE
print pdf bug & DOCTYPE OK with <!DOCTYPE html> <!DOCTYPE html> <html lang=" ...
- apt-get使用指南
最近频繁使用apt-cache show(查看软件包详细信息)与apt-cache search(搜寻具体软件包确切名称)命令,深感方便与功能强大.现将一些apt-get相关命令做一个简单的收集: a ...
- Animations动画和Keyframes关键帧
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 今天開始慢下脚步,開始ios技术知识的查漏补缺。
从2014.6.30 開始工作算起. 如今已经是第416天了.不止不觉.时间过的真快. 通过对之前工作的总结.发现,你的知识面.会决定你面对问题时的态度.过程和结果. 简单来讲.知识面拓展了,你才干有 ...
- Python中range和xrange的异同之处
range 函数说明:range([start,] stop[, step]).依据start与stop指定的范围以及step设定的步长,生成一个序列. range演示样例: >> ...
- iOS UITextView 高度随文字自己主动添加,并尾随键盘移动(二)
上节地址:http://blog.csdn.net/lwjok2007/article/details/47401293 接着上节我们来实现 输入框自己主动调节高度 首先,我们得知道,要推断是否该换行 ...