повторение XML-данных в SQL Server 2005 - PullRequest
1 голос
/ 12 октября 2009

У меня есть хранимая процедура, которая принимает

@MissingRecordsXML NTEXT

Содержит записи XML. Теперь другой разработчик использовал курсор для извлечения строк из OPENXML, а затем применил все бизнес-правила к каждой строке, и после этого каждая строка вставляется в таблицу.

Я хочу знать, какой способ лучше всего использовать XML-данные в SQL Server. Мне нужно повысить производительность этого SP, поскольку он работает очень медленно, когда имеется несколько записей. Курсоры уже объявлены только для чтения.

Код, который заполняет курсор из XML: -

exec sp_xml_preparedocument @hDocSEC OUTPUT,@MissingRecordsXML  

DECLARE SEC_UPDATE CURSOR  FOR  
SELECT MissingColumn,TableName,PhysicalColName,Grantor_Grantee  
FROM OPENXML (@hDocSEC,'MissingDS/MissingTable',2)  
WITH (MissingColumn VARCHAR(1000),TableName VARCHAR(100),  
PhysicalColName VARCHAR(100),Grantor_Grantee VARCHAR(100) )  
OPEN SEC_UPDATE  
FETCH NEXT FROM SEC_UPDATE  
INTO @MissingColumn,@TableName,@ActualColumnName,@Grantor_Grantee 

Ответы [ 2 ]

5 голосов
/ 12 октября 2009

Предположим, что ваш пример XML выглядит примерно так:

<MissingDS>
  <MissingTable>
    <MissingColumn>abc</MissingColumn>
    <TableName>tblMyTable</TableName>
    <PhysicalColName>table_abc</PhysicalColName>
    <Grantor_Grantee>nobody</Grantor_Grantee>
  </MissingTable>
  <MissingTable>
    <MissingColumn>xyu</MissingColumn>
    <TableName>tblMyTable2</TableName>
    <PhysicalColName>table_xyz</PhysicalColName>
    <Grantor_Grantee>nobody2</Grantor_Grantee>
  </MissingTable>
</MissingDS>

Затем вы можете проанализировать это с помощью новой поддержки SQL Server 2005 XQuery, например:

DECLARE @MissingXML XML
SET @MissingXML = CAST(@MissingRecordsXML AS XML)

SELECT
    Missing.Rec.value('(MissingColumn)[1]', 'varchar(1000)') AS 'MissingColumn',
    Missing.Rec.value('(TableName)[1]', 'varchar(100)') AS 'TableName',
    Missing.Rec.value('(PhysicalColName)[1]', 'varchar(100)') AS 'Physical',
    Missing.Rec.value('(Grantor_Grantee)[1]', 'varchar(100)') AS 'Grantor_Grantee'
FROM
    @MissingXML.nodes('/MissingDS/MissingTable') AS Missing(Rec)

Конечно, если вы можете ВЫБРАТЬ его, вы также можете очень легко ВСТАВИТЬ те же строки данных в таблицу:

INSERT INTO 
  dbo.MissingDSTable(MissingColumn, TableName, PhysicalColName, Grantor_Grantee)
    SELECT
       Missing.Rec.value('(MissingColumn)[1]', 'varchar(1000)') AS 'MissingColumn',
       Missing.Rec.value('(TableName)[1]', 'varchar(100)') AS 'TableName',
       Missing.Rec.value('(PhysicalColName)[1]', 'varchar(100)') AS 'Physical',
       Missing.Rec.value('(Grantor_Grantee)[1]', 'varchar(100)') AS 'Grantor_Grantee'
    FROM
       @MissingXML.nodes('/MissingDS/MissingTable') AS Missing(Rec)

Надеюсь, это немного поможет

Марк

0 голосов
/ 12 октября 2009

Я не эксперт по XML в SQL, но у меня есть некоторые шрамы от работы с ним. Я настоятельно рекомендую изучить параметры SQL XQuery (новые в SQL 2005, в BOL или здесь онлайн) или, возможно, функциональность SQL 2000 (начните с чтения "sp_xml_preparedocument" - здесь подчеркивается, что "xml" ", но ТАК не любит мошеннические подчеркивания - снова в BOL или там ).

(изм)

Я отключил ссылки, так как они перестали работать через несколько минут после того, как я их нашел (живи и учись). Ваши новые образцы показывают, что вы уже знаете об операторах sp_XML ..., и вы получаете действительные образцы XQuery, так что вы должны быть хорошими.

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