繁体   English   中英

SQL Server 2019 查询在尝试将单个列分成多列数据时返回所有 null 值

[英]SQL Server 2019 query returns all null values when trying to separate a single column into multiples columns of data

我有一个使用/作为分隔符的数据表。 我正在尝试将单列数据分成三列。

我的查询返回了正确的行数,但所有三列都是 NULL。 是否有任何我错过的明显内容跳出页面?

以下是数据在PGroup列中的存储方式:

Steve/Mouse/Vitamin
Matt/Cat/Soda
Shelly/Dog/Bread

我希望返回 3 个单独的列: Name, Pet, Food

DECLARE @delimiter VARCHAR(50)
SET @delimiter='/' 

;WITH CTE AS
(
    SELECT 
        CAST('' + REPLACE([PGroup], @delimiter, '') + '' AS XML) AS [PXML]
    FROM 
        xx123
)
SELECT
    [PXML].value('/M[1]', 'varchar(50)') As [Name],
    [PXML].value('/M[2]', 'varchar(50)') As [Pet],
    [PXML].value('/M[3]', 'varchar(50)') As [Food]
FROM 
    CTE

请尝试以下解决方案。

值得注意的点:

  • CData 部分可防止 XML 实体(如&符号等)。
  • 出于性能原因,将 XPath 表达式调整为使用text()

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, tokens VARCHAR(1000));
INSERT INTO @tbl (tokens) VALUES
('Steve/Mouse/Vitamin'),
('Matt/Cat/Soda'),
('Shelly/Dog/Bread');
-- DDL and sample data population, end

DECLARE @separator CHAR(1) = '/';

SELECT ID
    , c.value('(/root/r[1]/text())[1]', 'varchar(50)') As [Name]
    , c.value('(/root/r[2]/text())[1]', 'varchar(50)') As [Pet]
    , c.value('(/root/r[3]/text())[1]', 'varchar(50)') As [Food]
FROM @tbl
CROSS APPLY (SELECT TRY_CAST('<root><r><![CDATA[' + 
        REPLACE(tokens, @separator, ']]></r><r><![CDATA[') + 
        ']]></r></root>' AS XML)) AS t(c);

Output

+----+--------+-------+---------+
| ID |  Name  |  Pet  |  Food   |
+----+--------+-------+---------+
|  1 | Steve  | Mouse | Vitamin |
|  2 | Matt   | Cat   | Soda    |
|  3 | Shelly | Dog   | Bread   |
+----+--------+-------+---------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM