T-SQL过滤XML变量

时间:2010-09-07 16:09:44

标签: sql xml

我想知道以下哪两个是更好的方法来过滤我的xml变量中的列。

INSERT INTO [Tracking].[Team]([Name], [Description], [Begin_Dt], [End_Dt], [Update_Dt])
SELECT 
        x.[Team].value('Name', 'varchar(100)') AS [Name],
        x.[Team].value('Description', 'varchar(250)') AS [Description],
        x.[Team].value('Begin_Dt', 'datetime') AS [Begin_Dt],
        x.[Team].value('End_Dt', 'datetime') AS [End_Dt],
        getdate() as [Update_Dt]
FROM @xml.nodes('/Team') x([Team])
WHERE x.[Team].value('Team_Ref_ID', 'int') = 0


INSERT INTO [Tracking].[Team]([Name], [Description], [Begin_Dt], [End_Dt], [Update_Dt])
SELECT 
        x.[Team].value('Name', 'varchar(100)') AS [Name],
        x.[Team].value('Description', 'varchar(250)') AS [Description],
        x.[Team].value('Begin_Dt', 'datetime') AS [Begin_Dt],
        x.[Team].value('End_Dt', 'datetime') AS [End_Dt],
        getdate() as [Update_Dt]
FROM @xml.nodes('/Team') x([Team])
WHERE x.[Team].exist('Team_Ref_ID[. = 0]') = 1

注意WHERE子句,一个使用存在,另一个使用值,还是第三个方法更有效?

谢谢, 劳尔

2 个答案:

答案 0 :(得分:0)

要查询@xml变量,您可以做的最好的改进是使其具有XML模式的类型,请参阅Typed XML Compared to Untyped XML。这将使查询中的XPath表达式受益(.nodes('/Team'),各种.value.exists运算符。但是,在分配变量时验证模式会有前期成本。

另一个典型的XML性能改进是XML索引,但不幸的是它们不能应用于变量,因此关于你的问题,这一点就是静音。

关于你的特定细节问题(.value('Team_Ref_ID')是否比.exists('Team_Ref_ID[. = 0]')更快)我认为前者更快,但我没有证据,我很可能是错。

答案 1 :(得分:0)

实际上我发现更好的是这个

INSERT INTO [Tracking].[Team]([Name], [Description], [Begin_Dt], [End_Dt], [Update_Dt])
SELECT 
        x.[Team].value('Name', 'varchar(100)') AS [Name],
        x.[Team].value('Description', 'varchar(250)') AS [Description],
        x.[Team].value('Begin_Dt', 'datetime') AS [Begin_Dt],
        x.[Team].value('End_Dt', 'datetime') AS [End_Dt],
        getdate() as [Update_Dt]
FROM @xml.nodes('/Team[Team_Ref_Id = 0]') x([Team])

它过滤掉xml解析器中的节点,而不必在SQL中过滤掉它们。