xml到sql server问题

时间:2015-11-29 10:14:53

标签: sql-server xml tsql

我有一个xml代码,我将用于插入数据到sql server表。我想解析这个xml并插入到sql server表中。

<?xml version="1.0" encoding="utf-8"?>

<resources>
    <color name="red_50">#FFEBEE</color>
    <color name="red_100">#FFCDD2</color>
    <color name="red_200">#EF9A9A</color>
    <color name="red_300">#E57373</color>
    <color name="red_400">#EF5350</color>
    <color name="red_500">#F44336</color>
    <color name="red_600">#E53935</color>
    <color name="red_700">#D32F2F</color>
    <color name="red_800">#C62828</color>
    <color name="red_900">#B71C1C</color>
    <color name="red_A100">#FF8A80</color>
    <color name="red_A200">#FF5252</color>
    <color name="red_A400">#FF1744</color>
    <color name="red_A700">#D50000</color>
</resources>

实施例: 对于

<color name="orange_50">#FFF3E0</color>

主要问题是得到: name:orange_50, hue:orange, value:50, hexcolor:#FFF3E0并将所有数据保存到表格。

这就是我的尝试:

DECLARE @XML XML = '<resources> 
  <color name="red_600">#E53935</color>  
  <color name="red_700">#D32F2F</color>  
  <color name="red_800">#C62828</color>  
  <color name="red_900">#B71C1C</color>  
  <color name="red_A100">#FF8A80</color>  
  <color name="red_A200">#FF5252</color>  
  <color name="red_A400">#FF1744</color>  
  <color name="red_A700">#D50000</color> 
</resources>
'

SELECT NAME = Events.value('@name', 'varchar(25)')
FROM @XML.nodes('ressources/color') AS XTbl(Events)

我尝试获取颜色名称并且工作正常但是为了得到十六进制我不知道怎么做。我想在red_800中提取,例如,红色仅用于色调列,800用于值列。 感谢

1 个答案:

答案 0 :(得分:0)

这是一种可能的方式:

SELECT 
  NAME = Events.value('@name', 'varchar(25)')
  ,HUE = SUBSTRING(Events.value('@name', 'varchar(25)'), 1, CHARINDEX('_', Events.value('@name', 'varchar(25)'))-1)
  ,VALUE = SUBSTRING(Events.value('@name', 'varchar(25)'), CHARINDEX('_', Events.value('@name', 'varchar(25)')) + 1, LEN(Events.value('@name', 'varchar(25)')))
  ,HEXCOLOR = Events.value('.', 'varchar(25)')
FROM @XML.nodes('/resources/color') AS XTbl(Events)

<强> Sqlfiddle Demo

输出

|     NAME | HUE | VALUE | HEXCOLOR |
|----------|-----|-------|----------|
|  red_600 | red |   600 |  #E53935 |
|  red_700 | red |   700 |  #D32F2F |
|  red_800 | red |   800 |  #C62828 |
|  red_900 | red |   900 |  #B71C1C |
| red_A100 | red |  A100 |  #FF8A80 |
| red_A200 | red |  A200 |  #FF5252 |
| red_A400 | red |  A400 |  #FF1744 |
| red_A700 | red |  A700 |  #D50000 |

相关讨论: T-SQL get substring after specific character? *

*)此处使用相同的技巧获取位于name _之后的VALUE属性值以及_ HUE之前的client_secret属性值的一部分}列