Как получить значение атрибута xml из столбца таблицы в списке выбора - PullRequest
0 голосов
/ 05 ноября 2019
DECLARE @xml AS XML
SET @xml = CONVERT(xml,'<data><UserType userID="123">employee</UserType></data>')  
  SELECT   (SELECT d.value('@userID', 'int')   
       FROM  @xml.nodes('//data/UserType') T(d)) 

У меня есть таблица, столбец которой похож на приведенный выше XML. Можно ли получить значение @userID в операторе выбора?

В моей таблице «Пользователи» столбец «XmlData» имеет тип XML.

SELECT
    userID -- u.XmlData

FROM Users u

Как получить идентификатор пользователяатрибут из XML в операторе выбора? Я знаю, как разбирать его один раз, но не в выборе.

Ответы [ 3 ]

0 голосов
/ 05 ноября 2019

С небольшим поворотом.

Пример

Declare @YourTable table (ID int,XMLData nvarchar(max))
Insert Into @YourTable values
(1,'<data><UserType userID="123">employee</UserType></data>')

Select A.ID
      ,C.*
 From  @YourTable A
 Cross Apply ( values (convert(XML,XMLData) )) B(XData)
 Cross Apply ( Select UserID = d.value('@userID', 'int')   
                 From XData.nodes('/data/UserType') T(d)
             ) C

Возвращает

ID  UserID
1   123

Обновление Если только ОДИН идентификатор пользователя в XML

Declare @YourTable table (ID int,XMLData nvarchar(max))
Insert Into @YourTable values
(1,'<data><UserType userID="123">employee</UserType></data>')

Select A.ID
      ,UserID = convert(XML,XMLData).value('/data[1]/UserType[1]/@userID', 'int')   
 From  @YourTable A
0 голосов
/ 05 ноября 2019

Та же идея, что и у Джона Каппеллетти, только с CTE для преобразования в XML.

SQL

DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, XMLData NVARCHAR(MAX));
INSERT INTO @tbl (XMLData)
VALUES
(N'<data><UserType userID="123">employee</UserType></data>');

;WITH rs AS
(
    SELECT *, TRY_CAST(XMLData AS XML) AS xml_data FROM @tbl
)
SELECT ID
    , col.value('@userID','INT') AS userID
FROM rs
    CROSS APPLY rs.[xml_Data].nodes('/data/UserType') AS tab(col);

Вывод

+----+--------+
| ID | userID |
+----+--------+
|  1 |    123 |
+----+--------+
0 голосов
/ 05 ноября 2019

Вы вяжете их вместе с APPLY. Что-то вроде:

SELECT
    u.*,
    SELECT T.d.value('@userID', 'int') userID 
FROM Users u
CROSS APPLY u.XmlData.nodes('/data/UserType') T(d) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...