簡體   English   中英

T-SQL篩選器XML變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM