在存储过程中查询 xml 格式的日期
本文关键字:格式 日期 xml 查询 存储 存储过程 过程中 | 更新日期: 2023-09-27 18:36:14
我有一个存储过程
ALTER PROCEDURE [dbo].[CallHistoryBasedOnPersonInfoPerEvent]
(
@LastName varchar(50)
,@FirstName varchar(50)
,@Gender varchar(20)
,@StartDate varchar(20)
,@EndDate varchar(20) = null
)
AS
BEGIN
SELECT
*
FROM
CallerInformation
INNER JOIN
ActivityLog ON CallerInformation.CallerID = ActivityLog.CallerID
LEFT OUTER JOIN
CaseStatus ON CallerInformation.CaseStatusID = CaseStatus.CaseStatusID
WHERE
(ActivityLog.ActivityID = 1)
AND
ActivityLog.SearchParameter.value('(/Root/PersonSearch/LastName)[1]','varchar(50)') = @LastName
AND
ActivityLog.SearchParameter.value('(/Root/PersonSearch/FirstName)[1]','varchar(50)') = @FirstName
AND
ActivityLog.SearchParameter.value('(/Root/PersonSearch/Gender)[1]','varchar(20)') = @Gender
AND
ActivityLog.SearchParameter.value('(/Root/PersonSearch/StartDate)[1]','varchar(20)') = @StartDate
AND
ActivityLog.SearchParameter.value('(/Root/PersonSearch/EndDate)[1]','varchar(50)') = @EndDate
END
在表 ActivityLog
中,SearchParameter
是xml
列。xml 以这种格式存储在那里
<Root>
<PersonSearch>
<CallerID>1249</CallerID>
<StartDate>2013-01-16T00:00:00</StartDate>
<LastName>b</LastName>
<FirstName>t</FirstName>
<Gender>Male</Gender>
<DOBDay>0</DOBDay>
<DOBMonth>0</DOBMonth>
<AgeRangeStart>33</AgeRangeStart>
<AgeRangeEnd>44</AgeRangeEnd>
<Country>United States</Country>
<UserName>nojha</UserName>
</PersonSearch>
</Root>
根据我存储的程序中的连接,我必须在ActivityLog
中选择记录。FirstName
、LastName
、Gender
、Startdate
和Enddate
在XMl中。
现在我只面临日期问题。当我提供日期时,我在执行存储过程时没有收到任何记录。
我通过代码发送的startDate
采用这种格式1/16/2013 12:00:00 AM
.
我知道有些不匹配。我尝试了几件事。我删除了 XML 中的时间,并将参数@startdate
转换为日期。它没有用。然后我将@startdate
日期更改为varchar(20)
.它没有用。
我哪里出错了
如果你做得正确,它工作得很好 - 见这里:
-- define a table variable for demo purposes
DECLARE @table TABLE (ID INT, XMLDATA XML)
-- insert three rows with different <StartDate> values
INSERT INTO @table
VALUES
(1, '<Root><PersonSearch><StartDate>2013-01-16T00:00:00</StartDate></PersonSearch></Root>'),
(2, '<Root><PersonSearch><StartDate>2013-01-18T00:00:00</StartDate></PersonSearch></Root>'),
(3, '<Root><PersonSearch><StartDate>2013-01-16T00:00:00</StartDate></PersonSearch></Root>')
-- declare a search value, e.g. like the parameter of the stored procedure
DECLARE @SearchDate DATE = '20130116'
-- select the rows from the table
SELECT
ID
FROM
@table
WHERE
XmlData.value('(/Root/PersonSearch/StartDate)[1]','date') = @SearchDate
我选择了 #1 和 #3 ID
- 正如预期的那样。
因此,如果您真的使用DATE
作为日期,那么它就可以工作。