我想知道以下哪两个是更好的方法来过滤我的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子句,一个使用存在,另一个使用值,还是第三个方法更有效?
谢谢, 劳尔
答案 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中过滤掉它们。