在存储过程中以xml查询日期

时间:2013-10-21 18:30:38

标签: c# sql sql-server xml

我有一个存储过程

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中,SearchParameterxml列。 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>

根据我存储的procudure中的连接,我必须在ActivityLog中选择记录。 FirstNameLastNameGenderStartdateEnddate位于XMl中。

现在我只面临日期问题。当我提供日期时,我在执行存储过程时没有记录。

我通过我的代码发送的startDate格式为1/16/2013 12:00:00 AM

我知道有些不匹配。我做了几件事。我删除了Xml中的时间,并将参数@startdate转换为日期。那没起效。然后我将@startdate日期更改为varchar(20)。它不起作用。

我哪里出错

1 个答案:

答案 0 :(得分:1)

如果你这样做正确,它可以正常 - 请看这里:

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

我选择了ID#1和#3 - 正如预期的那样。

因此,如果您真的使用DATE作为日期,那么就可以了