从定义为 XML 的字段查询 SQL 服务器中的 XML

Query XML in SQL Server from a field defined as XML

我有以下 XML 片段:

<Plan>
  <CurrentTransaction StartDate="2016-01-01" EndDate="2016-01-31">
  </CurrentTransaction>
  <Transaction StartDate="2015-10-01" EndDate="2015-10-31">
  </Transaction>
  <Transaction StartDate="2015-11-01" EndDate="2015-11-30">
  </Transaction>
  <Transaction StartDate="2015-12-01" EndDate="2015-12-31">
  </Transaction>  
</Plan

我正在尝试根据日期进行查询,所以我使用了以下 SQL:

DECLARE @StartDate AS Datetime = '2015-10-01'
DECLARE @EndDate AS Datetime = '2015-10-31'

SELECT [Tran].T.value('(@StartDate)[1]','datetime') AS TranStart,
FROM   [dbo].MyTable mt 
CROSS  APPLY pp.MyXMl.nodes('(Plan/Transaction , Plan/CurrentTransaction)') AS [Tran](T)
WHERE  [Tran].T.value( '(@StartDate)[1]','datetime2') 
BETWEEN ISNULL(@StartDate,  [Tran].T.value( '(@StartDate)[1]','datetime2'))
AND     ISNULL(@EndDate,[Tran].T.value( '(@StartDate)[1]','datetime2'))  

所以理论上,上面应该带回一条记录,十月的那条,但没有,它带回了所有记录。

我试过转换日期以及使用 DateTime2,但没有任何效果。

有人能帮忙吗?

注意:

刚刚将查询中的 where 子句更改为:

 [Tran].T.value( '(@StartDate)[1]','datetime') BETWEEN @StartDate AND @EndDate

我还是一样。

DECLARE @xml XML ='
<Plan>
  <CurrentTransaction StartDate="2016-01-01" EndDate="2016-01-31" />
  <Transaction StartDate="2015-10-01" EndDate="2015-10-31" />
  <Transaction StartDate="2015-11-01" EndDate="2015-11-30" />
  <Transaction StartDate="2015-12-01" EndDate="2015-12-31" />  
</Plan>'

DECLARE
      @StartDate DATE = '2015-10-01'
    , @EndDate DATE = '2015-10-31'

SELECT *
FROM (
    SELECT
          StartDate = t.c.value('@StartDate','DATE')
        , EndDate = t.c.value('@EndDate','DATE')
    FROM @xml.nodes('Plan/*') t(c)
) t
WHERE StartDate BETWEEN ISNULL(@StartDate, StartDate) AND ISNULL(@EndDate, EndDate)

结果 -

StartDate  EndDate
---------- ----------
2015-10-01 2015-10-31

更新 -

DECLARE
      @StartDate DATE = '2015-10-01'
    , @EndDate DATE = '2015-10-31'

SELECT *
FROM (
    SELECT
          StartDate = t.c.value('@StartDate','DATE')
        , EndDate = t.c.value('@EndDate','DATE')
    FROM dbo.MyTable
    CROSS APPLY MyXMl.nodes('Plan/*') t(c)
) t
WHERE StartDate BETWEEN ISNULL(@StartDate, StartDate) AND ISNULL(@EndDate, EndDate)

并检查这个 -

XML, XQuery & Perfomance Issues