2013-10-21 29 views
0

我有一个存储过程查询日期在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 

在表ActivityLogSearchParameterxml柱。 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选择记录的连接。 FirstName,LastName,Gender,StartdateEnddate位于XM1中。

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

我通过我的代码发送的startDate采用这种格式1/16/2013 12:00:00 AM

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

我要去哪里错了

+0

@marc_s - 有趣的是,你会使用duck类型定义(相当强烈)类型的语言。根据我的经验,在两个不同的系统中处理日期可能非常困难 - 有时将它们转换为字符串表示是比较它们的唯一方法。 – JDB

+0

@marc_s请点击光明节。正如我所提到的,在转换为字符串之前我已经完成了日期。但是两次尝试都失败了。 – DotNetBeginner

回答

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日期,你应该反正,然后它只是工作

+0

这不会导致表扫描吗?或者有没有办法索引XML的内部位? –

+0

@MattJohnson:如果XML没有被索引(你*可以*在SQL Server中有XML索引),那么是的,这很可能导致表扫描。如果这是一个频繁的查询,可以使用用户定义的函数从XML中提取该“StartDate”,并将其作为**持久化的计算列**存储在表本身上,从而使其能够根据需要进行索引 –