从定义为 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 片段:
<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)
并检查这个 -