Запрос к узлу XML дает мне значение NULL - PullRequest
0 голосов
/ 01 октября 2019

Попытка добиться того, какая хранимая процедура использовалась для каждого отчета на сервере отчетов.

INSERT INTO #ReportRawXML
    SELECT  
        ItemID, RPT.[Name] AS ReportName,
        CONVERT(XML, CONVERT(VARBINARY(MAX), RPT.Content)) AS XMLdata
    FROM    
        ReportServer.dbo.[Catalog] AS RPT
    WHERE 
        RPT.[Name] LIKE '%catalog%'

Пример XML:

<Report>
<DataSets>
    <DataSet Name="DSET_ReportRepository">
      <Query>
        <DataSourceName>CCA_PROD</DataSourceName>
    </Query>
</DataSets>
</Report>

У меня есть таблица со столбцом XML, которую яхочу запросить, но я получаю NULL обратно;Я перепробовал все возможные способы, пожалуйста, кому-то совет.

SELECT 
    b.ItemID, b.ReportName,
    n.c.value('@DataSourceName', 'VARCHAR(MAX)') AS id,
    n.c.value('/DataSourceName[1]', 'VARCHAR(500)') AS DataSourceName,
    n.c.value('/CommandType[1]', 'VARCHAR(100)') AS CommandType,
    n.c.value('/CommandText[1]', 'VARCHAR(100)') AS CommandText
FROM    
    #ReportRawXML b
OUTER APPLY 
    b.XMLdata.nodes('/Report/DataSets/DataSet/Query') AS n(c)

Вопрос: получение значения NULL в столбце 3 выше

1 Ответ

1 голос
/ 02 октября 2019

Некоторые подсказки для вашего следующего вопроса:

  • Пожалуйста, попробуйте добавить MCVE ( автономный образец , как я предоставляю его здесь для вас) с самого начала,Вы знаете все свои данные, но мы не ...
  • Попробуйте добавить образец, где образец включает в себя все (например, ваш образец не показывает CommandType или CommandText
  • Пожалуйста, прочитайте о внутренних инструментах форматирования в SO, как добавить код, обычный текст, как выделить или процитировать ...
  • Пожалуйста, запустите ваш пример самостоятельно. Таким образом, вы обнаружили, что XMLпредоставлено не правильно сформировано (отсутствует </DataSet>).

Но теперь к вашему вопросу:

DECLARE @mockupTable TABLE(ID INT IDENTITY, XMLdata XML);
INSERT INTO @mockupTable VALUES
(N'<Report>
    <DataSets>
        <DataSet Name="DSET_ReportRepository">
          <Query>
            <DataSourceName>CCA_PROD</DataSourceName>
          </Query>
        </DataSet>
    </DataSets> 
</Report>');

- Запрос

SELECT b.ID
      ,ds.value('(Query/DataSourceName/text())[1]', 'varchar(max)') as id
      ,ds.value('@Name', 'varchar(max)') as id
FROM    @mockupTable b
OUTER APPLY b.XMLdata.nodes('/Report/DataSets/DataSet') as  n(ds);

При чтении из XML вы должны знать, что @ перед именем указывает атрибут. Чтобы прочитать атрибут DataSet Name, вам это нужно, но не до DataSourceName, как в вашей собственной попытке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...