正在将数据从 xml 提取到 SQL 服务器 table
Extracting data from xml into SQL server table
我的 xml 格式如下:
[My company customer detail - Account ID <3116131311616116>, Subscriber Name <Jon>, Age <52>, Phone <>, Payment<CC>]
我无法将数据从 xml 传输到 SQL 服务器 table 列。列名称,如帐户 ID、订户名称、年龄、Phone、付款
上面提到的 xml 的详细信息似乎是字符串。 XML(String) 在如下列中:
enter image description here
我需要从详细信息列中提取数据,并将数据推送到具有 xml/string.
属性的新 table
通过“将数据从 xml 传输到 SQL 服务器 table 列”,我假设您的意思是插入到 sql 服务器 table。如果是这样,这意味着解析 xml 是在应用程序中完成的,然后您应该以 insert..values 的形式构造一个字符串,但显然需要更多信息。
另一种选择是将 xml 作为输入参数传递给存储过程,在过程中解析 xml 并插入 table。
您提供的信息越多,将有助于更好地回答您的问题。
这 2 个选项是有效的,这是设计和偏好的问题。一般来说,如果您要处理的 xml 很大,那么最好在应用程序中进行解析。
你可以使用这样的查询
SELECT CAST([XMLData] AS XML).value('(/MyCompany/AccountID)[1]', 'VARCHAR(MAX)') AS "Account ID",
CAST([XMLData] AS XML).value('(/MyCompany/SubscriberName)[1]', 'VARCHAR(MAX)') AS "Subscriber Name",
CAST([XMLData] AS XML).value('(/MyCompany/Age)[1]', 'VARCHAR(MAX)') AS "Age",
CAST([XMLData] AS XML).value('(/MyCompany/Phone)[1]', 'VARCHAR(MAX)') AS "Phone",
CAST([XMLData] AS XML).value('(/MyCompany/Payment)[1]', 'VARCHAR(MAX)') AS "Payment"
FROM tab
假设您在类型 VARCHAR
的 table 中有一个列 [XMLData]
,其值为
<MyCompany>
<AccountID>3116131311616116</AccountID>
<Phone></Phone>
<Age>52</Age>
<SubscriberName>Jon</SubscriberName>
<Payment>CC</Payment>
</MyCompany>
取决于提供的数据。
如果列的类型为 XML
,则不需要转换,例如用作 [XMLData].value
请尝试以下解决方案。
首先将乱码字符串转换为XML。它是 XML 的那一刻,其余的都是微不足道的。
SQL
DECLARE @unstructured VARCHAR(max) = '[My company customer detail - Account ID <3116131311616116>, Subscriber Name <Jon>, Age <52>, Phone <>, Payment<CC>]';
DECLARE @separator CHAR(1) = '>'
, @lt CHAR(1) = '<';
;WITH rs AS
(
SELECT TRY_CAST('<root><r><![CDATA[' +
REPLACE(@unstructured, @separator, ']]></r><r><![CDATA[') +
']]></r></root>' AS XML) AS xmldata
), cte AS
(
SELECT c.value('(r[1]/text())[1]','VARCHAR(100)') AS col1
, c.value('(r[2]/text())[1]','VARCHAR(30)') AS col2
, c.value('(r[3]/text())[1]','VARCHAR(30)') AS col3
, c.value('(r[4]/text())[1]','VARCHAR(30)') AS col4
, c.value('(r[5]/text())[1]','VARCHAR(30)') AS col5
FROM rs CROSS APPLY xmldata.nodes('/root') AS t(c)
)
SELECT STUFF(col1, 1, CHARINDEX(@lt, col1,1), '') AS AccountID
, STUFF(col2, 1, CHARINDEX(@lt, col2,1), '') AS SubscriberName
, STUFF(col3, 1, CHARINDEX(@lt, col3,1), '') AS Age
, STUFF(col4, 1, CHARINDEX(@lt, col4,1), '') AS Phone
, STUFF(col5, 1, CHARINDEX(@lt, col5,1), '') AS Payment
FROM cte;
输出
+------------------+----------------+-----+-------+---------+
| AccountID | SubscriberName | Age | Phone | Payment |
+------------------+----------------+-----+-------+---------+
| 3116131311616116 | Jon | 52 | | CC |
+------------------+----------------+-----+-------+---------+
这是一个 super-duper 技巧,它不限于一定数量的“列”:
-- Data mock-up.
DECLARE @value VARCHAR(500) = '[My company customer detail - Account ID <3116131311616116>, Subscriber Name <Jon>, Age <52>, Phone <>, Payment<CC>]';
-- Construct the dynamic SQL field/value list.
DECLARE @sql VARCHAR(MAX);
SELECT @sql = ISNULL( @sql, '' )
+ ', ' + QUOTENAME( SUBSTRING( value, CHARINDEX( '<', value ) + 1, CHARINDEX( '>', value ) - CHARINDEX( '<', value ) - 1 ), '''' )
+ ' AS [' + LTRIM( RTRIM( LEFT( value, CHARINDEX( '<', value ) - 1 ) ) ) + ']'
FROM STRING_SPLIT( REPLACE( REPLACE( @value, ']', '' ), '[', '' ), ',' )
-- Complete the dynamic SQL.
SET @sql = 'SELECT ' + STUFF( @sql, 1, 2, '' ) + ';';
-- Print the resulting dynamic SQL.
PRINT @sql;
-- Execute the dynamic SQL.
EXEC( @sql );
打印显示:
SELECT '3116131311616116' AS [My company customer detail - Account ID], 'Jon' AS [Subscriber Name], '52' AS [Age], '' AS [Phone], 'CC' AS [Payment];
执行 returns:
+-----------------------------------------+-----------------+-----+-------+---------+
| My company customer detail - Account ID | Subscriber Name | Age | Phone | Payment |
+-----------------------------------------+-----------------+-----+-------+---------+
| 3116131311616116 | Jon | 52 | | CC |
+-----------------------------------------+-----------------+-----+-------+---------+
我的 xml 格式如下:
[My company customer detail - Account ID <3116131311616116>, Subscriber Name <Jon>, Age <52>, Phone <>, Payment<CC>]
我无法将数据从 xml 传输到 SQL 服务器 table 列。列名称,如帐户 ID、订户名称、年龄、Phone、付款
上面提到的 xml 的详细信息似乎是字符串。 XML(String) 在如下列中: enter image description here
我需要从详细信息列中提取数据,并将数据推送到具有 xml/string.
属性的新 table通过“将数据从 xml 传输到 SQL 服务器 table 列”,我假设您的意思是插入到 sql 服务器 table。如果是这样,这意味着解析 xml 是在应用程序中完成的,然后您应该以 insert..values 的形式构造一个字符串,但显然需要更多信息。 另一种选择是将 xml 作为输入参数传递给存储过程,在过程中解析 xml 并插入 table。 您提供的信息越多,将有助于更好地回答您的问题。 这 2 个选项是有效的,这是设计和偏好的问题。一般来说,如果您要处理的 xml 很大,那么最好在应用程序中进行解析。
你可以使用这样的查询
SELECT CAST([XMLData] AS XML).value('(/MyCompany/AccountID)[1]', 'VARCHAR(MAX)') AS "Account ID",
CAST([XMLData] AS XML).value('(/MyCompany/SubscriberName)[1]', 'VARCHAR(MAX)') AS "Subscriber Name",
CAST([XMLData] AS XML).value('(/MyCompany/Age)[1]', 'VARCHAR(MAX)') AS "Age",
CAST([XMLData] AS XML).value('(/MyCompany/Phone)[1]', 'VARCHAR(MAX)') AS "Phone",
CAST([XMLData] AS XML).value('(/MyCompany/Payment)[1]', 'VARCHAR(MAX)') AS "Payment"
FROM tab
假设您在类型 VARCHAR
的 table 中有一个列 [XMLData]
,其值为
<MyCompany>
<AccountID>3116131311616116</AccountID>
<Phone></Phone>
<Age>52</Age>
<SubscriberName>Jon</SubscriberName>
<Payment>CC</Payment>
</MyCompany>
取决于提供的数据。
如果列的类型为 XML
,则不需要转换,例如用作 [XMLData].value
请尝试以下解决方案。
首先将乱码字符串转换为XML。它是 XML 的那一刻,其余的都是微不足道的。
SQL
DECLARE @unstructured VARCHAR(max) = '[My company customer detail - Account ID <3116131311616116>, Subscriber Name <Jon>, Age <52>, Phone <>, Payment<CC>]';
DECLARE @separator CHAR(1) = '>'
, @lt CHAR(1) = '<';
;WITH rs AS
(
SELECT TRY_CAST('<root><r><![CDATA[' +
REPLACE(@unstructured, @separator, ']]></r><r><![CDATA[') +
']]></r></root>' AS XML) AS xmldata
), cte AS
(
SELECT c.value('(r[1]/text())[1]','VARCHAR(100)') AS col1
, c.value('(r[2]/text())[1]','VARCHAR(30)') AS col2
, c.value('(r[3]/text())[1]','VARCHAR(30)') AS col3
, c.value('(r[4]/text())[1]','VARCHAR(30)') AS col4
, c.value('(r[5]/text())[1]','VARCHAR(30)') AS col5
FROM rs CROSS APPLY xmldata.nodes('/root') AS t(c)
)
SELECT STUFF(col1, 1, CHARINDEX(@lt, col1,1), '') AS AccountID
, STUFF(col2, 1, CHARINDEX(@lt, col2,1), '') AS SubscriberName
, STUFF(col3, 1, CHARINDEX(@lt, col3,1), '') AS Age
, STUFF(col4, 1, CHARINDEX(@lt, col4,1), '') AS Phone
, STUFF(col5, 1, CHARINDEX(@lt, col5,1), '') AS Payment
FROM cte;
输出
+------------------+----------------+-----+-------+---------+
| AccountID | SubscriberName | Age | Phone | Payment |
+------------------+----------------+-----+-------+---------+
| 3116131311616116 | Jon | 52 | | CC |
+------------------+----------------+-----+-------+---------+
这是一个 super-duper 技巧,它不限于一定数量的“列”:
-- Data mock-up.
DECLARE @value VARCHAR(500) = '[My company customer detail - Account ID <3116131311616116>, Subscriber Name <Jon>, Age <52>, Phone <>, Payment<CC>]';
-- Construct the dynamic SQL field/value list.
DECLARE @sql VARCHAR(MAX);
SELECT @sql = ISNULL( @sql, '' )
+ ', ' + QUOTENAME( SUBSTRING( value, CHARINDEX( '<', value ) + 1, CHARINDEX( '>', value ) - CHARINDEX( '<', value ) - 1 ), '''' )
+ ' AS [' + LTRIM( RTRIM( LEFT( value, CHARINDEX( '<', value ) - 1 ) ) ) + ']'
FROM STRING_SPLIT( REPLACE( REPLACE( @value, ']', '' ), '[', '' ), ',' )
-- Complete the dynamic SQL.
SET @sql = 'SELECT ' + STUFF( @sql, 1, 2, '' ) + ';';
-- Print the resulting dynamic SQL.
PRINT @sql;
-- Execute the dynamic SQL.
EXEC( @sql );
打印显示:
SELECT '3116131311616116' AS [My company customer detail - Account ID], 'Jon' AS [Subscriber Name], '52' AS [Age], '' AS [Phone], 'CC' AS [Payment];
执行 returns:
+-----------------------------------------+-----------------+-----+-------+---------+
| My company customer detail - Account ID | Subscriber Name | Age | Phone | Payment |
+-----------------------------------------+-----------------+-----+-------+---------+
| 3116131311616116 | Jon | 52 | | CC |
+-----------------------------------------+-----------------+-----+-------+---------+