2010-09-07 50 views
0

我在想以下哪兩種方法是在我的xml變量的列上篩選的更好方法。T-SQL篩選器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

假設「更好」意味着「執行更好」,您是否嘗試過查看兩者的查詢計劃? – 2010-09-07 16:46:30

回答

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節點。

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]')快)我認爲前者是快,但我沒有證據,我可能是錯的。