正在将数据从 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

Demo

请尝试以下解决方案。

首先将乱码字符串转换为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      |
+-----------------------------------------+-----------------+-----+-------+---------+