ColdFusion MsSQL с суммой () со значением NULL - PullRequest
0 голосов
/ 04 января 2011

Я проверял это с CF 9 и MsSQL 2005

CREATE TABLE HAVING_SUM
(
    A_VARCHAR VARCHAR(5),
    B_INT INT
)

INSERT INTO HAVING_SUM ( A_VARCHAR, B_INT ) VALUES ( 'AB', 2 )
INSERT INTO HAVING_SUM ( A_VARCHAR, B_INT ) VALUES ( 'AB', 3 )
INSERT INTO HAVING_SUM ( A_VARCHAR, B_INT ) VALUES ( 'AB', 5 )
INSERT INTO HAVING_SUM ( A_VARCHAR, B_INT ) VALUES ( 'CD', 2 )
INSERT INTO HAVING_SUM ( A_VARCHAR, B_INT ) VALUES ( 'CD', 7 )
INSERT INTO HAVING_SUM ( A_VARCHAR, B_INT ) VALUES ( 'CD', 8 )
INSERT INTO HAVING_SUM ( A_VARCHAR, B_INT ) VALUES ( 'CD', NULL)

и запрос в Ms SQL Server Management Studio Express

SELECT  *
FROM    HAVING_SUM

SELECT  A_VARCHAR,
        SUM(B_INT) AS B_INT
FROM    HAVING_SUM
GROUP BY A_VARCHAR

SELECT  A_VARCHAR,
        SUM(B_INT) AS B_INT
FROM    HAVING_SUM
GROUP BY A_VARCHAR
HAVING SUM(B_INT) = 10

SELECT  A_VARCHAR,
        SUM(B_INT) AS B_INT
FROM    HAVING_SUM
GROUP BY A_VARCHAR
HAVING SUM(B_INT) = 10.5

результат

alt text

тогда я попытался использовать cfquery

<cfquery name="qryHavingSum_1">
SELECT  *
FROM    HAVING_SUM
</cfquery>

<cfdump var="#qryHavingSum_1#">

<cfquery name="qryHavingSum_2">
SELECT  A_VARCHAR,
        SUM(B_INT) AS B_INT
FROM    HAVING_SUM
GROUP BY A_VARCHAR
</cfquery>

<cfdump var="#qryHavingSum_2#">

<cfquery name="qryHavingSum_3">
SELECT  A_VARCHAR,
        SUM(B_INT) AS B_INT
FROM    HAVING_SUM
GROUP BY A_VARCHAR
HAVING SUM(B_INT) = 10
</cfquery>

<cfdump var="#qryHavingSum_3#">

<cfquery name="qryHavingSum_4">
SELECT  A_VARCHAR,
        SUM(B_INT) AS B_INT
FROM    HAVING_SUM
GROUP BY A_VARCHAR
HAVING SUM(B_INT) = 10.5
</cfquery>

<cfdump var="#qryHavingSum_4#">

и результат

alt text alt text

Редактировать (начать здесь): прокрутите вниз до отладчика У меня есть

alt text

эта красная область указывает, что выполняется qryHavingSum_4, с 0 записью , но в разделе Exception qryHavingSum_4 не определено (<cfdump var="#qryHavingSum_4#">) Редактировать (конец здесь)

если я изменю qryHavingSum_4 на

<cfquery name="qryHavingSum_4">
SELECT  A_VARCHAR,
        SUM(ISNULL(B_INT, 0)) AS B_INT
FROM    HAVING_SUM
GROUP BY A_VARCHAR
HAVING SUM(ISNULL(B_INT, 0)) = 10.5
</cfquery>

результат

alt text

и затем я попытался изменить SUM(B_INT) (без ISNULL) и HAVING SUM(B_INT) (без ISNULL) с другим оператором > >= < <= <> !=, и это работает.

почему я не могу использовать = с запросом выше в CF? это CFbugs?

спасибо

1 Ответ

4 голосов
/ 04 января 2011

Management Studio удаляет пустые значения (при запуске проверьте вкладку сообщений, и вы увидите следующее)

Warning: Null value is eliminated by an aggregate or other SET operation.

Драйвер coldfusion mssql этого не делает.

Лучше всего использовать функцию isnull.

В качестве альтернативы вы можете отключить предупреждения ANSI в вашем cfquery и повторно включить их после их запуска Таким образом, вы можете изменить запрос 4 на

SET ANSI_WARNINGS OFF
SELECT  A_VARCHAR,
        SUM(B_INT) AS B_INT
FROM    HAVING_SUM
GROUP BY A_VARCHAR
HAVING SUM(B_INT)=10.5
SET ANSI_WARNINGS ON
...