2013-10-21 25 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」,並將其作爲**持久化的計算列**存儲在表本身上,從而使其能夠根據需要進行索引 –