Внешнее применение с оператором case и Xpath внутри возвращает ошибку - PullRequest
1 голос
/ 07 мая 2020

В моей таблице 3 столбца:

  • EmployeeId
  • Актив
  • Данные

Данные имеют тип XML, который содержит предметы и оценки. Мне нужно извлечь метку и тему из XML, но когда идентификатор сотрудника InActive, мне нужно просто вернуть один результат как NULL, даже если XML имеет тему и метку.

Ниже приведен запрос, который я попробовал и получил следующую ошибку.

В списке выбора можно указать только одно выражение, если подзапрос не вводится с EXISTS.

SELECT eo.employeeid, 
       Result.marks.[Subject], 
       Result.marks.[Mark] 
FROM   employee eo 
       OUTER apply (SELECT CASE 
             WHEN eo.active = 0 THEN (SELECT NULL AS 'Subject', 
                                             NULL AS 'Mark') 
             ELSE ((SELECT f.n.value('@Subject', 'varchar(100)') 
                           AS 
                           'Subject', 
                           f.n.value('@Mark', 'int') 
                           AS 
                           'Mark' 
                    FROM   eo.data.nodes('(/Employee/Results)') AS 
                           F(n))) 
           END AS marks) Result 

1 Ответ

0 голосов
/ 10 мая 2020
DECLARE @employee TABLE
(
employeeid INT IDENTITY(1,1),
active BIT,
data XML
);

INSERT INTO @employee(active, data)
VALUES
(1, N'<Employee><Results Subject="subject 1" Mark="111"/></Employee>'),
(1, N'<Employee><Results Subject="subject 2" Mark="222"/></Employee>'),
(0, N'<Employee><Results Subject="subject 3" Mark="333"/></Employee>');

SELECT 
    eo.employeeid, eo.active,
    f.n.value('@Subject', 'varchar(100)') AS 'Subject', 
    f.n.value('@Mark', 'int') AS 'Mark' 
FROM
(
    SELECT employeeid, active,
        CASE active WHEN 1 THEN data END AS data
FROM @employee
) AS eo
OUTER APPLY eo.data.nodes('Employee/Results') AS F(n);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...