【发布时间】:2012-11-08 13:26:08
【问题描述】:
我的 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 操作。 ... -
而为什么您将 GUID 存储为
varchar(36)列类型?最好的办法是使用UNIQUEIDENTIFIER- 本机 SQL Server Guid 类型。或者,如果你不能,无论出于何种原因——那么至少使用char(36),因为它总是正好是 36 个字符——“var”部分是完全没有必要的(而且只会产生开销.. .) -
感谢您的帮助,WHY 是我是一个 SQL 白痴,作为一个白痴,我试图避免可能与其他列类型一起出现的未知陷阱/约束并使用我熟悉的东西,而我原型这个黑客:) 顺便说一句,我在 xml 中有一个无限长度的字段,varchar(MAX) 是否将 ALL 放在 TEXT 列?
标签: sql sql-server xml tsql sqlxml