一.准备需转为DataTable的json字符串

原json字符串数据

  1. [{"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

  1. /// <summary>
  2. /// Json转Table
  3. /// </summary>
  4. /// <param name="jsonString"></param>
  5. /// <param name="isVerticalTable">是否竖表</param>
  6. [Microsoft.SqlServer.Server.SqlProcedure]
  7. public static void Json2Table(string jsonString, bool isVerticalTable)
  8. {
  9. SqlDataRecord dataRecord = new SqlDataRecord();
  10. var ListObject = Json.Deserialize(jsonString) as List<object>;
  11. var Object = Json.Deserialize(jsonString) as Dictionary<string, object>;
  12. if (ListObject == null && Object == null)
  13. return;
  14. if (ListObject == null)
  15. {
  16. ListObject = new List<object>();
  17. ListObject.Add(Object);
  18. }
  19. List<SqlMetaData> sqlMetaDatas = new List<SqlMetaData>();
  20. Dictionary<string, object> KeyObject = (Dictionary<string, object>)ListObject[];
  21. if (!isVerticalTable)
  22. {
  23. foreach (var jProperty in KeyObject)
  24. {
  25. sqlMetaDatas.Add(new SqlMetaData(jProperty.Key, SqlDbType.NVarChar, ));
  26. }
  27. dataRecord = new SqlDataRecord(sqlMetaDatas.ToArray());
  28. SqlContext.Pipe.SendResultsStart(dataRecord);
  29. for (int i = ; i < ListObject.Count(); i++)
  30. {
  31. Dictionary<string, object> DicObject = (Dictionary<string, object>)ListObject[i];
  32. int j = ;
  33. foreach (var item in KeyObject)
  34. {
  35. dataRecord.SetString(j, DicObject[item.Key].ToStringJson());
  36. j++;
  37. }
  38. SqlContext.Pipe.SendResultsRow(dataRecord);
  39. }
  40. SqlContext.Pipe.SendResultsEnd();
  41. }
  42. else
  43. {
  44. dataRecord = new SqlDataRecord(new SqlMetaData[] { new SqlMetaData("id", SqlDbType.Int), new SqlMetaData("key", SqlDbType.NVarChar, ), new SqlMetaData("value", SqlDbType.NVarChar, ) });
  45. SqlContext.Pipe.SendResultsStart(dataRecord);
  46. for (int i = ; i < ListObject.Count(); i++)
  47. {
  48. Dictionary<string, object> DicObject = (Dictionary<string, object>)ListObject[i];
  49. foreach (var item in DicObject)
  50. {
  51. dataRecord.SetInt32(, i + );
  52. dataRecord.SetString(, item.Key.ToString());
  53. dataRecord.SetString(, item.Value.ToStringJson());
  54. SqlContext.Pipe.SendResultsRow(dataRecord);
  55. }
  56. }
  57. SqlContext.Pipe.SendResultsEnd();
  58. }
  59. SqlContext.Pipe.Send("ok");
  60. }
  61. public static class StaticMethod
  62. {
  63. public static string ToStringJson(this object thisObject)
  64. {
  65. if (thisObject == null)
  66. return "";
  67. if (thisObject is Dictionary<string,object>)
  68. return Json.Serialize(thisObject);
  69. else if (thisObject is List<object>)
  70. return Json.Serialize(thisObject);
  71. return thisObject.ToString();
  72. }
  73.  
  74. }

开源MiniJSON类解析Json字符串

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Text;
  7.  
  8. namespace SQLClr
  9. {
  10. /// <summary>
  11. /// This class encodes and decodes JSON strings.
  12. /// Spec. details, see http://www.json.org/
  13. ///
  14. /// JSON uses Arrays and Objects. These correspond here to the datatypes IList and IDictionary.
  15. /// All numbers are parsed to doubles.
  16. /// </summary>
  17. public static class Json
  18. {
  19. /// <summary>
  20. /// Parses the string json into a value
  21. /// </summary>
  22. /// <param name="json">A JSON string.</param>
  23. /// <returns>An List<object>, a Dictionary<string, object>, a double, an integer,a string, null, true, or false</returns>
  24. //反序列化
  25. public static object Deserialize(string json)
  26. {
  27. // save the string for debug information
  28. if (json == null)
  29. {
  30. return null;
  31. }
  32.  
  33. return Parser.Parse(json);
  34. }
  35. //阻止其他类从该类继承
  36. sealed class Parser : IDisposable
  37. {
  38. const string WORD_BREAK = "{}[],:\"";
  39.  
  40. public static bool IsWordBreak(char c)
  41. {
  42. // 如果 c 是空白,则为 true;否则,为 false;报告指定 Unicode 字符在此字符串中的第一个匹配项的索引。
  43. return Char.IsWhiteSpace(c) || WORD_BREAK.IndexOf(c) != -;
  44. }
  45.  
  46. enum TOKEN
  47. {
  48. NONE,
  49. CURLY_OPEN,
  50. CURLY_CLOSE,
  51. SQUARED_OPEN,
  52. SQUARED_CLOSE,
  53. COLON,
  54. COMMA,
  55. STRING,
  56. NUMBER,
  57. TRUE,
  58. FALSE,
  59. NULL
  60. };
  61. // 实现从字符串进行读取的 System.IO.TextReader。
  62. StringReader json;
  63.  
  64. Parser(string jsonString)
  65. {
  66. json = new StringReader(jsonString);
  67. }
  68.  
  69. public static object Parse(string jsonString)
  70. {
  71. using (var instance = new Parser(jsonString))
  72. {
  73. return instance.ParseValue();
  74. }
  75. }
  76. //释放
  77. public void Dispose()
  78. {
  79. json.Dispose();
  80. json = null;
  81. }
  82.  
  83. Dictionary<string, object> ParseObject()
  84. {
  85. Dictionary<string, object> table = new Dictionary<string, object>();
  86.  
  87. // ditch opening brace
  88. json.Read();
  89.  
  90. // {
  91. while (true)
  92. {
  93. switch (NextToken)
  94. {
  95. case TOKEN.NONE:
  96. return null;
  97. case TOKEN.COMMA:
  98. continue;
  99. case TOKEN.CURLY_CLOSE:
  100. return table;
  101. default:
  102. // name
  103. string name = ParseString();
  104. if (name == null)
  105. {
  106. return null;
  107. }
  108.  
  109. // :
  110. if (NextToken != TOKEN.COLON)
  111. {
  112. return null;
  113. }
  114. // ditch the colon
  115. json.Read();
  116.  
  117. // value
  118. table[name] = ParseValue();
  119. break;
  120. }
  121. }
  122. }
  123.  
  124. List<object> ParseArray()
  125. {
  126. List<object> array = new List<object>();
  127.  
  128. // ditch opening bracket
  129. json.Read();
  130.  
  131. // [
  132. bool parsing = true;
  133. while (parsing)
  134. {
  135. TOKEN nextToken = NextToken;
  136.  
  137. switch (nextToken)
  138. {
  139. case TOKEN.NONE:
  140. return null;
  141. case TOKEN.COMMA:
  142. continue;
  143. case TOKEN.SQUARED_CLOSE:
  144. parsing = false;
  145. break;
  146. default:
  147. object value = ParseByToken(nextToken);
  148.  
  149. array.Add(value);
  150. break;
  151. }
  152. }
  153.  
  154. return array;
  155. }
  156.  
  157. object ParseValue()
  158. {
  159. TOKEN nextToken = NextToken;
  160. return ParseByToken(nextToken);
  161. }
  162.  
  163. object ParseByToken(TOKEN token)
  164. {
  165. switch (token)
  166. {
  167. case TOKEN.STRING:
  168. return ParseString();
  169. case TOKEN.NUMBER:
  170. return ParseNumber();
  171. case TOKEN.CURLY_OPEN:
  172. return ParseObject();
  173. case TOKEN.SQUARED_OPEN:
  174. return ParseArray();
  175. case TOKEN.TRUE:
  176. return true;
  177. case TOKEN.FALSE:
  178. return false;
  179. case TOKEN.NULL:
  180. return null;
  181. default:
  182. return null;
  183. }
  184. }
  185.  
  186. string ParseString()
  187. {
  188. StringBuilder s = new StringBuilder();
  189. char c;
  190.  
  191. // ditch opening quote
  192. json.Read();
  193.  
  194. bool parsing = true;
  195. while (parsing)
  196. {
  197.  
  198. if (json.Peek() == -)
  199. {
  200. parsing = false;
  201. break;
  202. }
  203.  
  204. c = NextChar;
  205. switch (c)
  206. {
  207. case '"':
  208. parsing = false;
  209. break;
  210. case '\\':
  211. if (json.Peek() == -)
  212. {
  213. parsing = false;
  214. break;
  215. }
  216.  
  217. c = NextChar;
  218. switch (c)
  219. {
  220. case '"':
  221. case '\\':
  222. case '/':
  223. s.Append(c);
  224. break;
  225. case 'b':
  226. s.Append('\b');
  227. break;
  228. case 'f':
  229. s.Append('\f');
  230. break;
  231. case 'n':
  232. s.Append('\n');
  233. break;
  234. case 'r':
  235. s.Append('\r');
  236. break;
  237. case 't':
  238. s.Append('\t');
  239. break;
  240. case 'u':
  241. var hex = new char[];
  242.  
  243. for (int i = ; i < ; i++)
  244. {
  245. hex[i] = NextChar;
  246. }
  247.  
  248. s.Append((char)Convert.ToInt32(new string(hex), ));
  249. break;
  250. }
  251. break;
  252. default:
  253. s.Append(c);
  254. break;
  255. }
  256. }
  257.  
  258. return s.ToString();
  259. }
  260.  
  261. object ParseNumber()
  262. {
  263. string number = NextWord;
  264. // 摘要:
  265. // 报告指定 Unicode 字符在此字符串中的第一个匹配项的索引。
  266. //
  267. // 参数:
  268. // value:
  269. // 要查找的 Unicode 字符。
  270. //
  271. // 返回结果:
  272. // 如果找到该字符,则为 value 的从零开始的索引位置;如果未找到,则为 -1。
  273. if (number.IndexOf('.') == -)
  274. {
  275. long parsedInt;
  276. // 将数字的字符串表示形式转换为它的等效 64 位有符号整数。一个指示转换是否成功的返回值。
  277. Int64.TryParse(number, out parsedInt);
  278. return parsedInt;
  279. }
  280.  
  281. double parsedDouble;
  282. Double.TryParse(number, out parsedDouble);
  283. return parsedDouble;
  284. }
  285. //
  286. void EatWhitespace()
  287. {
  288. //指示指定字符串中位于指定位置处的字符是否属于空白类别。
  289. while (Char.IsWhiteSpace(PeekChar))
  290. {
  291. json.Read();
  292. //摘要:
  293. // 返回下一个可用的字符,但不使用它。
  294. //
  295. // 返回结果:
  296. // 表示下一个要读取的字符的整数,或者,如果没有更多的可用字符或该流不支持查找,则为 -1。
  297. if (json.Peek() == -)
  298. {
  299. break;
  300. }
  301. }
  302. }
  303.  
  304. char PeekChar
  305. {
  306. get
  307. {
  308. // 读取输入字符串中的下一个字符并将该字符的位置提升一个字符。
  309. //
  310. // 返回结果:
  311. // 基础字符串中的下一个字符,或者如果没有更多的可用字符,则为 -1。
  312. return Convert.ToChar(json.Peek());
  313. }
  314. }
  315.  
  316. char NextChar
  317. {
  318. get
  319. {
  320. return Convert.ToChar(json.Read());
  321. }
  322. }
  323.  
  324. string NextWord
  325. {
  326. get
  327. {
  328. // 表示可变字符字符串。无法继承此类。
  329. StringBuilder word = new StringBuilder();
  330.  
  331. while (!IsWordBreak(PeekChar))
  332. {
  333. // 摘要:
  334. // 在此实例的结尾追加指定 Unicode 字符的字符串表示形式。
  335. //
  336. // 参数:
  337. // value:
  338. // 要追加的 Unicode 字符。
  339. //
  340. // 返回结果:
  341. // 完成追加操作后对此实例的引用。
  342. word.Append(NextChar);
  343. //下一个字符为空
  344. if (json.Peek() == -)
  345. {
  346. break;
  347. }
  348. }
  349. //
  350. return word.ToString();
  351. }
  352. }
  353.  
  354. TOKEN NextToken
  355. {
  356. get
  357. {
  358. EatWhitespace();
  359.  
  360. if (json.Peek() == -)
  361. {
  362. return TOKEN.NONE;
  363. }
  364.  
  365. switch (PeekChar)
  366. {
  367. case '{':
  368. return TOKEN.CURLY_OPEN;
  369. case '}':
  370. json.Read();
  371. return TOKEN.CURLY_CLOSE;
  372. case '[':
  373. return TOKEN.SQUARED_OPEN;
  374. case ']':
  375. json.Read();
  376. return TOKEN.SQUARED_CLOSE;
  377. case ',':
  378. json.Read();
  379. return TOKEN.COMMA;
  380. case '"':
  381. return TOKEN.STRING;
  382. case ':':
  383. return TOKEN.COLON;
  384. case '':
  385. case '':
  386. case '':
  387. case '':
  388. case '':
  389. case '':
  390. case '':
  391. case '':
  392. case '':
  393. case '':
  394. case '-':
  395. return TOKEN.NUMBER;
  396. }
  397.  
  398. switch (NextWord)
  399. {
  400. case "false":
  401. return TOKEN.FALSE;
  402. case "true":
  403. return TOKEN.TRUE;
  404. case "null":
  405. return TOKEN.NULL;
  406. }
  407.  
  408. return TOKEN.NONE;
  409. }
  410. }
  411. }
  412.  
  413. /// <summary>
  414. /// Converts a IDictionary / IList object or a simple type (string, int, etc.) into a JSON string
  415. /// </summary>
  416. /// <param name="json">A Dictionary<string, object> / List<object></param>
  417. /// <returns>A JSON encoded string, or null if object 'json' is not serializable</returns>
  418. public static string Serialize(object obj)
  419. {
  420. return Serializer.Serialize(obj);
  421. }
  422.  
  423. sealed class Serializer
  424. {
  425. StringBuilder builder;
  426.  
  427. Serializer()
  428. {
  429. //创建生成器
  430. builder = new StringBuilder();
  431. }
  432. //序列化
  433. public static string Serialize(object obj)
  434. {
  435. var instance = new Serializer();
  436.  
  437. instance.SerializeValue(obj);
  438.  
  439. return instance.builder.ToString();
  440. }
  441. //类型
  442. void SerializeValue(object value)
  443. {
  444. IList asList;
  445. IDictionary asDict;
  446. string asStr;
  447.  
  448. if (value == null)
  449. {
  450. builder.Append("null");
  451. }
  452. else if ((asStr = value as string) != null)
  453. {
  454. SerializeString(asStr);
  455. }
  456. else if (value is bool)
  457. {
  458. builder.Append((bool)value ? "true" : "false");
  459. }
  460. else if ((asList = value as IList) != null)
  461. {
  462. SerializeArray(asList);
  463. }
  464. else if ((asDict = value as IDictionary) != null)
  465. {
  466. SerializeObject(asDict);
  467. }
  468. else if (value is char)
  469. {
  470. SerializeString(new string((char)value, ));
  471. }
  472. else
  473. {
  474. SerializeOther(value);
  475. }
  476. }
  477. //序列化对象
  478. void SerializeObject(IDictionary obj)
  479. {
  480. bool first = true;
  481.  
  482. builder.Append('{');
  483.  
  484. foreach (object e in obj.Keys)
  485. {
  486. if (!first)
  487. {
  488. builder.Append(',');
  489. }
  490.  
  491. SerializeString(e.ToString());
  492. builder.Append(':');
  493.  
  494. SerializeValue(obj[e]);
  495.  
  496. first = false;
  497. }
  498.  
  499. builder.Append('}');
  500. }
  501. // 序列化数组
  502. void SerializeArray(IList anArray)
  503. {
  504. builder.Append('[');
  505.  
  506. bool first = true;
  507.  
  508. foreach (object obj in anArray)
  509. {
  510. if (!first)
  511. {
  512. builder.Append(',');
  513. }
  514.  
  515. SerializeValue(obj);
  516.  
  517. first = false;
  518. }
  519.  
  520. builder.Append(']');
  521. }
  522. //string
  523. void SerializeString(string str)
  524. {
  525. builder.Append('\"');
  526.  
  527. char[] charArray = str.ToCharArray();
  528. foreach (var c in charArray)
  529. {
  530. switch (c)
  531. {
  532. case '"':
  533. builder.Append("\\\"");
  534. break;
  535. case '\\':
  536. builder.Append("\\\\");
  537. break;
  538. case '\b':
  539. builder.Append("\\b");
  540. break;
  541. case '\f':
  542. builder.Append("\\f");
  543. break;
  544. case '\n':
  545. builder.Append("\\n");
  546. break;
  547. case '\r':
  548. builder.Append("\\r");
  549. break;
  550. case '\t':
  551. builder.Append("\\t");
  552. break;
  553. default:
  554. int codepoint = Convert.ToInt32(c);
  555. if ((codepoint >= ) && (codepoint <= ))
  556. {
  557. builder.Append(c);
  558. }
  559. else
  560. {
  561. //builder.Append("\\u");
  562. //builder.Append(codepoint.ToString("x4"));
  563. builder.Append(c);
  564. }
  565. break;
  566. }
  567. }
  568.  
  569. builder.Append('\"');
  570. }
  571. //其他
  572. void SerializeOther(object value)
  573. {
  574. // NOTE: decimals lose precision during serialization.
  575. // They always have, I'm just letting you know.
  576. // Previously floats and doubles lost precision too.
  577. //注意:小数在序列化过程中丢失精度。
  578. //他们总是有,我只是让你知道。
  579. //以前失去精度和双精度浮点数。
  580. if (value is float)
  581. {
  582. builder.Append(((float)value).ToString("R"));
  583. }
  584. else if (value is int
  585. || value is uint
  586. || value is long
  587. || value is sbyte
  588. || value is byte
  589. || value is short
  590. || value is ushort
  591. || value is ulong)
  592. {
  593. builder.Append(value);
  594. }
  595. else if (value is double
  596. || value is decimal)
  597. {
  598. builder.Append(Convert.ToDouble(value).ToString("R"));
  599. }
  600. else
  601. {
  602. SerializeString(value.ToString());
  603. }
  604. }
  605. }
  606. }
  607. }

三.SQL服务器CLR配置(允许SQL调用.net程序)

  1. sp_configure 'show advanced options', 1;
  2. RECONFIGURE WITH override
  3. GO
  4. sp_configure 'clr enabled', 1;
  5. RECONFIGURE WITH override
  6. GO
  7. Sp_changedbowner 'sa',true --sa改为当前登入用户名
  8. alter database [dbname] set trustworthy on --bbname 改为自己的库名

四.注册 CLR 程序集

  1. create ASSEMBLY SQLfunctionAssembly
  2. FROM 'D:\SQLClr.dll' --改为自己C#写的dll路径填写
  3. WITH PERMISSION_SET = UNSAFE;

创建的.net程序集数据会写入下表:

  1. select * from sys.assemblies
  2. select * from sys.assembly_files

五.创建存储过程

  1. CREATE PROCEDURE[dbo].[Json2Table] (
  2. @jsonString NVARCHAR(max),
  3. @isVerticalTable bit
  4. )
  5. WITH EXECUTE AS CALLER
  6. AS
  7. EXTERNAL NAME [SQLfunctionAssembly].[SQLClr.SQLfunction].[Json2Table] --[SQL程序集名].[命名空间.类名].[方法名]

六.测试Json转DataTable存储过程

  1. DECLARE @jsonString VARCHAR(MAX)
  2. SET @jsonString = '
  3. [{"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"}] '
  4. exec dbo.Json2Table @jsonString,0 --0转横表 1转竖表

运行后结果(转横表)

运行后结果(转竖表)

PCB MS SQL 存储过程(CLR) 实现Json转DataTable表的方法的更多相关文章

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

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

  2. PCB MS SQL 排序应用---SQL相邻数据区间值求解

    其中一篇 博文中有写<PCB MS SQL 排序应用---相邻数据且相同合并处理>此篇有也应相用也同的技巧,实现相邻数据区间值求解 示例: 原数据:处理前 求出区间值:处理后 SQL 代码 ...

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

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

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

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

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

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

  6. json转datatable(正则表达式的方法)

    /// <summary> /// 将json转换为DataTable /// </summary> /// <param name="strJson" ...

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

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

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

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

  9. PCB MS SQL SERVER版本管控工具source_safe_for_sql_server

    PCB由于业务关系复杂,业务触发一个事件时,可能需与数据库多个表进行关连处理才能拿到数据结果, 而表关连并不是简单的关连,实际是要进行大量数据筛选,逻辑判断,转换等过程...这个过程是复杂的 想一想, ...

随机推荐

  1. git 的 基础操作及使用

    /* git svn版本控制器 */ /*git把文件对应的储存空间分为三个区: 1.工作区 2.缓存区 3.历史区 直接操作文件,不做add时,咱们是在工作区做的修改 右键 git bash her ...

  2. 在Eclipse中设置Maven插件

    [步骤] Maven插件的设置: ①installations:指定Maven核心程序的位置.不建议使用Maven插件自带的Maven程序,而应该使用我们自己解压的那个. ②user settings ...

  3. 【Codeforces 159B】Matchmaker

    [链接] 我是链接,点我呀:) [题意] 笔和笔盖 笔有颜色和直径 笔盖也有颜色和直径 笔盖和笔如果直径相等 那么称为good 如果笔盖和笔直径相等.颜色也相等,那么称为very good 问你怎样安 ...

  4. 【Codeforces 1037D】Valid BFS?

    [链接] 我是链接,点我呀:) [题意] 让你判断一个序列是否可能为一个bfs的序列 [题解] 先dfs出来每一层有多少个点,以及每个点是属于哪一层的. 每一层的bfs如果有先后顺序的话,下一层的节点 ...

  5. print pdf bug & DOCTYPE

    print pdf bug & DOCTYPE OK with <!DOCTYPE html> <!DOCTYPE html> <html lang=" ...

  6. apt-get使用指南

    最近频繁使用apt-cache show(查看软件包详细信息)与apt-cache search(搜寻具体软件包确切名称)命令,深感方便与功能强大.现将一些apt-get相关命令做一个简单的收集: a ...

  7. Animations动画和Keyframes关键帧

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 今天開始慢下脚步,開始ios技术知识的查漏补缺。

    从2014.6.30 開始工作算起. 如今已经是第416天了.不止不觉.时间过的真快. 通过对之前工作的总结.发现,你的知识面.会决定你面对问题时的态度.过程和结果. 简单来讲.知识面拓展了,你才干有 ...

  9. Python中range和xrange的异同之处

    range     函数说明:range([start,] stop[, step]).依据start与stop指定的范围以及step设定的步长,生成一个序列. range演示样例:  >> ...

  10. iOS UITextView 高度随文字自己主动添加,并尾随键盘移动(二)

    上节地址:http://blog.csdn.net/lwjok2007/article/details/47401293 接着上节我们来实现 输入框自己主动调节高度 首先,我们得知道,要推断是否该换行 ...