Моя XML-структура:
<Items>
<Item>
<guid>FC550573-7171-997F-752D-8D65590CBFD6</guid>
<Objects>
<Object>
<type>0</type>
<guid>E10D9DA9-2C8D-8024-2F07-DF21395811BF</guid>
</Object>
<Object>
<type>0</type>
<guid>D8338400-35C7-781E-A039-C0FDDF80714A</guid>
</Object>
</Objects>
</Item>
</Items>
При заполнении таблицы объектов:
CREATE TABLE [dbo].[Objects](
[item_guid] [varchar](36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[type] [int] NOT NULL,
[guid] [varchar](36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
) ON [PRIMARY]
Использование запроса:
INSERT INTO [dbname].[dbo].[Objects]
([item_guid]
,[type]
,[guid])
SELECT
X.source.query('../../guid').value('.','VARCHAR(36)') as item_guid,
X.source.query('type').value('.','INT') as type,
X.source.query('guid').value('.','VARCHAR(36)') as guid
FROM(
Select xmldata from XmlFiles where fullpath=@fp
) AS T(x)
CROSS APPLY x.nodes('Items/Item/Objects/Object') As X(source)
Эта строка делает запрос ОЧЕНЬ медленным:
X.source.query('../../guid').value('.','VARCHAR(36)') as item_guid
Какой здесь правильный подход?
X.source.query('type').value('.','INT')
- было бы намного проще написать это какX.source.value('(type)[1]', 'INT')
и сэкономить хотя бы одну операцию XQuery для каждого столбца, который вы оцениваете.... - person marc_s   schedule 08.11.2012varchar(36)
? Лучше всего было бы использоватьUNIQUEIDENTIFIER
— родной тип SQL Server Guid. Или, если вы не можете по какой-либо причине, то по крайней мере используйтеchar(36)
, так как это всегда будет ровно 36 символов - часть var совершенно не нужна (и создает только накладные расходы...) - person marc_s   schedule 08.11.2012