2009-10-12 6 views
1

У меня есть StoredProcedure, который принимаетперебор данных XML в SQL Server 2005

@MissingRecordsXML NTEXT 

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

Я хочу знать, что является лучшим способом для XML-данных foreach в 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 

ответ

0

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

(отредактированный)

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

5

Если предположить, что образец 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) 

Надеюсь, что это h ELPS немного

Марк

+0

Я считаю, XQuery быть боль, но как только вы получите это работает, это работает очень хорошо. –

+1

@Both: ... и no "sp_xml_preparedocument" тоже – gbn

+0

Marc-It очень помог. Могу выбрать одну строку за раз и выполнить некоторую обработку, а затем вставить ее в какую-нибудь другую таблицу, используя вышеуказанный подход. – Rohit