• Mark Cowne (7/17/2016)


    Interesting!

    Yes indeed and often overlooked.

    The difference is quite large, without the text() function, each value method results in three XML function calls, sort, joins etc., 15 operators in total. With the text() function it does a single XML function call per branch and the total of 5 operators.

    😎

    Full test set

    USE TEEST;

    GO

    SET NOCOUNT ON;

    --http://www.sqlservercentral.com/Forums/FindPost1802350.aspx

    IF OBJECT_ID(N'dbo.TBL_XML_NVARCHAR') IS NOT NULL DROP TABLE dbo.TBL_XML_NVARCHAR;

    CREATE TABLE dbo.TBL_XML_NVARCHAR

    (

    XN_ID INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_DBO_TBL_XML_NVARCHAR_XN_ID PRIMARY KEY CLUSTERED

    ,XN_VALUE NVARCHAR(MAX) NOT NULL

    );

    DECLARE @NVCXML NVARCHAR(MAX) = N'

    <BounceProperties>

    <Name>Bounce Category</Name>

    <Value>Hard bounce - User Unknown</Value>

    <Name>Bounce Type</Name>

    <Value>immediate</Value>

    <Name>SMTP Code</Name>

    <Value>550</Value>

    <Name>SMTP Reason</Name>

    <Value>smtp;550 email@testsite.net...User unknown</Value>

    </BounceProperties>';

    ;WITH T(N) AS (SELECT X.N FROM (VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0))AS X(N))

    , NUMS(N) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS N FROM T T1,T T2,T T3)

    INSERT INTO dbo.TBL_XML_NVARCHAR(XN_VALUE)

    SELECT

    @NVCXML

    FROM NUMS NM;

    -- text() function

    ;WITH XML_CONVERT AS

    (

    SELECT

    XN.XN_ID

    ,CONVERT(XML,XN.XN_VALUE,1) AS XML_VAL

    FROM dbo.TBL_XML_NVARCHAR XN

    )

    SELECT TOP 1000

    XC.XN_ID

    ,XC.XML_VAL.value('(/BounceProperties/Name/text())[1]','varchar(20)') AS Name1

    ,XC.XML_VAL.value('(/BounceProperties/Value/text())[1]','varchar(50)') AS Value1

    ,XC.XML_VAL.value('(/BounceProperties/Name/text())[2]','varchar(20)') AS Name2

    ,XC.XML_VAL.value('(/BounceProperties/Value/text())[2]','varchar(50)') AS Value2

    ,XC.XML_VAL.value('(/BounceProperties/Name/text())[3]','varchar(20)') AS Name3

    ,XC.XML_VAL.value('(/BounceProperties/Value/text())[3]','varchar(50)') AS Value3

    ,XC.XML_VAL.value('(/BounceProperties/Name/text())[4]','varchar(20)') AS Name4

    ,XC.XML_VAL.value('(/BounceProperties/Value/text())[4]','varchar(50)') AS Value4

    FROM XML_CONVERT XC;

    --direct reference without the text() function

    SELECT TOP 1000

    XN_ID

    --,CAST(XN_VALUE AS XML)

    ,CAST(XN_VALUE AS XML).value('(/BounceProperties/Name[1])[1]','varchar(20)') AS Name1

    ,CAST(XN_VALUE AS XML).value('(/BounceProperties/Value[1])[1]','varchar(50)') AS Value1

    ,CAST(XN_VALUE AS XML).value('(/BounceProperties/Name[2])[1]','varchar(20)') AS Name2

    ,CAST(XN_VALUE AS XML).value('(/BounceProperties/Value[2])[1]','varchar(50)') AS Value2

    ,CAST(XN_VALUE AS XML).value('(/BounceProperties/Name[3])[1]','varchar(20)') AS Name3

    ,CAST(XN_VALUE AS XML).value('(/BounceProperties/Value[3])[1]','varchar(50)') AS Value3

    ,CAST(XN_VALUE AS XML).value('(/BounceProperties/Name[4])[1]','varchar(20)') AS Name4

    ,CAST(XN_VALUE AS XML).value('(/BounceProperties/Value[4])[1]','varchar(50)') AS Value4

    FROM dbo.TBL_XML_NVARCHAR