2

ページをロードしたときにゼロ レコードを返すクエリがあります。同じクエリを (デバッグ出力から) navicat にコピー アンド ペーストすると、(予想どおり) 行が返されます。誰もこれを見たことがありますか?これは、ローカル (CF9) およびリモートのステージング サーバー (CF10) で発生します。さらに奇妙なことに、以前は正常に機能していたクエリです。if ステートメントを where 句に追加しただけで、突然...

クエリは次のとおりです。

    SELECT
        a.EncounterProductID,
        a.DateTime AS ServiceDate,
        aa.CartItemID,
        aaa.CartID,
        aaaaa.CartStatus,
        b.ProductID,
        b.ProductName,
        b.CPTCode,
        b.Price,
        c.EncounterID,
        c.DateTimeClosed AS EncounterClosedDate,
        d.FirstName,
        d.LastName
    FROM
        EncounterProducts a
            LEFT JOIN CartItemProduct aa ON (a.EncounterProductID = aa.EncounterProductID AND aa.Active = 1)
            LEFT JOIN CartItem aaa ON (aa.CartItemID = aaa.CartItemID)
            LEFT JOIN Cart aaaa ON (aaa.CartID = aaaa.CartID)
            LEFT JOIN CartStatus aaaaa ON (aaaa.CartStatusID = aaaaa.CartStatusID),
        Product b,
        Encounters c,
        Contacts d,
        EncounterStatuses e
    WHERE
        1 = 1
        AND (aa.CartItemID IS NULL OR aaaaa.CartStatus = 'Deleted')
        AND a.Active = 1
        AND a.ProductID = b.ProductID
        AND a.EncounterID = c.EncounterID
        AND c.PatientID = d.ContactID
        AND c.EncounterStatusID = e.EncounterStatusID
        AND e.EncounterStatus = 'Closed'
      <CFIF IsDefined("ARGUMENTS.encounter") AND IsObject(ARGUMENTS.encounter)>
             AND c.EncounterID = <CFQUERYPARAM cfsqltype="cf_sql_integer" value="#ARGUMENTS.encounter.getID()#">
     <CFELSE>
            AND c.DateTimeClosed >= <CFQUERYPARAM cfsqltype="cf_sql_date" value="#ARGUMENTS.startDate#">
            AND c.DateTimeClosed < <CFQUERYPARAM cfsqltype="cf_sql_date" value="#DateFormat(DateAdd('d', 1, ARGUMENTS.endDate), 'yyyy-mm-dd')# 00:00:00">
       </CFIF>
        AND c.LocationID = <CFQUERYPARAM cfsqltype="cf_sql_integer" value="#ARGUMENTS.locationID#">
        AND c.CustomerID = <CFQUERYPARAM cfsqltype="cf_sql_integer" value="#ARGUMENTS.customerID#">
    </CFQUERY>

行を追加する前に、これはすべて正常に機能しました。

<CFIF IsDefined("ARGUMENTS.encounter") AND IsObject(ARGUMENTS.encounter)>
    AND c.EncounterID = <CFQUERYPARAM cfsqltype="cf_sql_integer" value="#ARGUMENTS.encounter.getID()#">
<CFELSE>
    AND c.DateTimeClosed >= <CFQUERYPARAM cfsqltype="cf_sql_date" value="#ARGUMENTS.startDate#">
    AND c.DateTimeClosed < <CFQUERYPARAM cfsqltype="cf_sql_date" value="#DateFormat(DateAdd('d', 1, ARGUMENTS.endDate), 'yyyy-mm-dd')# 00:00:00">
</CFIF>

以前は、次のとおりでした。

AND c.DateTimeClosed >= <CFQUERYPARAM cfsqltype="cf_sql_date" value="#ARGUMENTS.startDate#">
AND c.DateTimeClosed < <CFQUERYPARAM cfsqltype="cf_sql_date" value="#DateFormat(DateAdd('d', 1, ARGUMENTS.endDate), 'yyyy-mm-dd')# 00:00:00">

IF/ELSE ステートメントなし。

前にこのようなものを見た人はいますか?何か案は?

ありがとう。

4

2 に答える 2

1

あなたの質問には2つの異なる部分があります。

パート1あなたは次のように述べました:

これは、以前は正常に機能していたクエリです。where句にifステートメントを追加しただけで、突然...

明らかに、これにより、新しいif条件がクエリの原因であり、以前に返されていた結果が返されなくなったと私は信じています。

クエリは次のように機能していました。

AND c.DateTimeClosed >= <CFQUERYPARAM cfsqltype="cf_sql_date" value="#ARGUMENTS.startDate#">
AND c.DateTimeClosed < <CFQUERYPARAM cfsqltype="cf_sql_date" value="#DateFormat(DateAdd('d', 1, ARGUMENTS.endDate), 'yyyy-mm-dd')# 00:00:00">

したがって、新しいif条件を渡しており、代わりにコードがこれを実行していると仮定しますが、結果は返されません。

AND c.EncounterID = <CFQUERYPARAM cfsqltype="cf_sql_integer" value="#ARGUMENTS.encounter.getID()#">

#ARGUMENTS.encounter.getID()#は期待どおりの結果を返していますか?Encountersテーブルには、実際にそのエンカウンターIDを持つレコードが含まれていますか?

パート2あなたは次のように述べました:

同じクエリを(デバッグ出力から)navicatにコピーして貼り付けると、(期待どおりに)行が返されます。

デバッグ出力を直接コピーして貼り付けて、変更せずに動作させることはできないと思います。少なくとも、パラメーター化された入力の値を入力する必要があります。では、navicatからクエリを実行するときに、どのような値を入力していますか?これらは、ColdFusionが実行時に生成する値と同じですか?

于 2012-09-12T19:59:57.197 に答える
0

これを置き換えてみてください:

#DateFormat(DateAdd('d', 1, ARGUMENTS.endDate), 'yyyy-mm-dd')# 00:00:00

これとともに:

#createODBCDateTime(DateAdd('d', 1, ARGUMENTS.endDate))#
于 2012-09-12T19:20:29.877 に答える