0

ストアドプロシージャがあります

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 

ActivityLogSearchParameterは、 は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。、FirstNameLastName、およびは XMl にありますGenderStartdateEnddate

現在、日付のみの問題に直面しています。日付を指定すると、ストアド プロシージャを実行しているときにレコードが取得されません。

startDateコードを介して送信している は、この形式です1/16/2013 12:00:00 AM

多少のズレがあることは承知しております。私はいくつかのことを試しました。Xml の時刻を削除し、パラメーター@startdateを日付に変換します。それは動かなかった。その後、@startdate日付をに変更しましたvarchar(20)。それは動かなかった。

どこで間違っているのですか

4

1 に答える 1

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に日付を使用する場合は、うまく機能します。

于 2013-10-21T19:01:06.270 に答える