我有一个带有xml的字段,如下所示:
<ApplicationProductFields>
<string>
<field name="Tech_LoginUzytkownika">lechowski</field>
</string>
<int />
<decimal />
<bool />
<datetime />
<appendix />
<enum />
<complex>
<field name="danePrzesylki">
<fv>
<rodzajPrzesylki>sPP</rodzajPrzesylki>
<dataWplywu>d08/24/2016 00:00:00</dataWplywu>
<nadawcaNazwisko>sKowalski</nadawcaNazwisko>
<dokumenty>
<tytulDokumentu>sDokument testowy 45</tytulDokumentu>
<dataUtworzenia>d2016-06-13 00:00:00</dataUtworzenia>
我需要在不同的表字段中插入所有值,例如。
|rodzajPrzesylki| dataWplywu |nadawcaNazwisko| tytulDokumentu |...
| sPP |d08/24/2016 00:00:00| sKowalski |sDokument testowy |...
我发现sql查询这个sql查询:
SELECT
col.value('(/ArrayOfEntityPropertyOfString/EntityPropertyOfString[Name="Profit Center"]/Value)[1]', 'int')
FROM tbl
但我不知道如何在我的xml构造中使用它。
有人帮我吗?
答案 0 :(得分:0)
您找到的是XPath。这种在XML上运行的查询语言具有相当简单的语法,您可以在其中描述从XML文档访问节点所需的路径。它是defined by the w3c,MDN可以更方便地记录它。
我会让您查看文档并为您的rodzajPrzesylki
字段提供XPath示例:
/ApplicationProductFields/complex/field[name="danePrzesylki"]/fv/rodzajPrzesylki
答案 1 :(得分:0)
如果这个XML及其生成在你的控制之下,你应该考虑一下:
未正确生成XML。 XML中的日期/时间值应遵循ISO8601
...您必须手动转换它们。
我认为,第一个字母(“sPP”或“d08 / 24 ......”)是一种数据类型标记(字符串和日期),这是非常不专业的...如果你是想要标记这一点,更好地使用类型属性或模式......
您提供的XML不完整(我必须使用某些标记关闭XML),您也没有显示目标表的结构。
无论如何:要做的第一件事就是粉碎XML。这将创建一个派生表。在我的示例中,我将使用CTE
为SELECT
语句提供此表。最后,您会看到SELECT * FROM CTE;
。这将提供结果集,好像它将从普通表中获取:
DECLARE @xml XML=
N'<ApplicationProductFields>
<string>
<field name="Tech_LoginUzytkownika">lechowski</field>
</string>
<int />
<decimal />
<bool />
<datetime />
<appendix />
<enum />
<complex>
<field name="danePrzesylki">
<fv>
<rodzajPrzesylki>sPP</rodzajPrzesylki>
<dataWplywu>d08/24/2016 00:00:00</dataWplywu>
<nadawcaNazwisko>sKowalski</nadawcaNazwisko>
<dokumenty>
<tytulDokumentu>sDokument testowy 45</tytulDokumentu>
<dataUtworzenia>d2016-06-13 00:00:00</dataUtworzenia>
</dokumenty>
</fv>
</field>
</complex>
</ApplicationProductFields>';
- 查询
WITH CTE AS
(
SELECT fld.value(N'@name','nvarchar(max)') AS FieldName
,fld.value(N'(fv/rodzajPrzesylki)[1]','nvarchar(max)') AS rodzajPrzesylki
,fld.value(N'(fv/dataWplywu)[1]','nvarchar(max)') AS dataWplywu
,fld.value(N'(fv/nadawcaNazwisko)[1]','nvarchar(max)') AS nadawcaNazwisko
,fld.value(N'(fv/dokumenty/tytulDokumentu)[1]','nvarchar(max)') AS tytulDokumentu
,fld.value(N'(fv/dokumenty/dataUtworzenia)[1]','nvarchar(max)') AS dataUtworzenia
FROM @xml.nodes(N'/ApplicationProductFields/complex/field') AS A(fld)
)
SELECT * FROM CTE;
只是把那些东西放在那里
INSERT INTO MyTargetTable(FieldName, rodarodzajPrzesylki, ...)
SELECT FieldName,rodzajPrzesylki,...
FROM CTE