[英]T-SQL Filter XML Variable
我想知道以下兩種方法中哪一種是對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子句,一種使用存在,另一種使用值,或者還有第三種方法更有效嗎?
謝謝,勞爾
要查詢@xml變量,您可以做的最大改進是使它具有XML模式的類型 ,請參見Typed XML與Untyped XML的比較 。 這將有利於查詢中的XPath表達式( .nodes('/Team')
,各種.value
和.exists
運算符)。 但是,在分配變量后,驗證架構會產生前期成本。
XML的另一項典型的性能改進是XML索引,但是不幸的是,它們不能應用於變量,因此對於您的問題而言,這一點是無語的。
至於您的特定細節問題( .value('Team_Ref_ID')
是否比.exists('Team_Ref_ID[. = 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中過濾掉它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.