【问题标题】:Query XML in SQL Server from a field defined as XML从定义为 XML 的字段查询 SQL Server 中的 XML
【发布时间】:2015-12-22 13:24:19
【问题描述】:

我有以下 XML sn-p:

<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'))  

所以理论上,上面应该带回一个记录,即 10 月份的记录,但它没有,它带回了所有记录。

我尝试过投射日期以及使用 DateTime2,但没有任何效果。

谁能帮忙?

注意:

只是将查询中的where子句改为:

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

我还是一样。

【问题讨论】:

    标签: sql sql-server xml xquery-sql


    【解决方案1】:
    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

    【讨论】:

    • 这很好用,但原谅我有点厚,我需要它来查询表中的 XML 数据字段。如果数据在名为 myXml 的字段中名为 xData 的表中,而不是声明的 xml 变量,我将如何更改上述内容以使用该字段?
    • 是的,知道了,抱歉,没有刷新页面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多