duankui6150 2014-02-25 08:20
浏览 35
已采纳

SQLSRV Null值将被Aggregate或Set删除

i trie to execute a Stored Procedure from PHP. My other SP´s are working correctly. But this one will make problems.

Here is my code for calling the SP:

            $sqlStmt = "EXEC MOBILE_CSKLIENT_LoadForSync @pCEGERAETNR = ?"; 
            $con = DatabaseManager::GetDatabaseConnection($serial); 
            $deviceNr = $this->GetDeviceNr($serial, $deviceId); 

            $res = sqlsrv_query($con, $sqlStmt, array($deviceNr)); 

            if($res == false) 
            { 
                    die( print_r( sqlsrv_errors(), true)); 
            } 
            else 
            { 
                    die( print_r( sqlsrv_errors(), true)); 
                    $result = array(); 
                    while($zeile = sqlsrv_fetch($res)) 
                    { 
                            echo sqlsrv_get_field($res, 0); 
                    } 
            }

here is my SP:

GO 
/****** Object:  StoredProcedure [dbo].[MOBILE_CSKLIENT_LoadForSync]    Script Date:     25.02.2014 08:36:01 ******/ 
 ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[MOBILE_CSKLIENT_LoadForSync](@pCEGERAETNR FLOAT) 
AS 
BEGIN 
DECLARE @pLASTCHANGE datetime 
SET @pLASTCHANGE = (SELECT MAX(LASTCHANGE) FROM CEMITARB WHERE CEGERAETNR = @pCEGERAETNR) 

IF @pLASTCHANGE IS NULL 
BEGIN           
    SELECT K.KLIENTNR, K.PROGRAMMNR, K.NAME, 
            K.VORNAME, K.[STR], K.PLZ, K.ORT , K.TELEFON1, K.TELEFON2, K.GEBDAT, K.GESCHLECHT, K.KEYKLIFR1, K.MAINVERSION   
            FROM CSKLIENT K 
            INNER JOIN S1PAT P ON P.KLIENTNR = K.KLIENTNR 
            INNER JOIN CSKLIZR Z ON Z.KLIENTNR = K.KLIENTNR 
            WHERE P.AKTIV = 'J' 
            AND (Z.AUFNAHME IS NULL OR Z.AUFNAHME <= GetDate()) 
            AND (Z.ENTLASSUNG IS NULL OR Z.ENTLASSUNG >= GetDate()) 
     UNION 
     SELECT K.KLIENTNR, K.PROGRAMMNR, K.NAME, 
            K.VORNAME, K.[STR], K.PLZ, K.ORT , K.TELEFON1, K.TELEFON2, K.GEBDAT, K.GESCHLECHT, K.KEYKLIFR1, K.MAINVERSION 
            FROM CSKLIENT K 
            INNER JOIN H1BEW B ON B.KLIENTNR = K.KLIENTNR 
            WHERE B.AKTIV = 'J' AND ZIMMER IS NOT NULL AND BEREICH IS NOT NULL 
 END 
 ELSE 
 BEGIN 
      SELECT K.KLIENTNR, K.PROGRAMMNR, K.NAME, 
            K.VORNAME, K.[STR], K.PLZ, K.ORT , K.TELEFON1, K.TELEFON2, K.GEBDAT, K.GESCHLECHT, K.KEYKLIFR1, K.MAINVERSION   
            FROM CSKLIENT K 
            INNER JOIN S1PAT P ON P.KLIENTNR = K.KLIENTNR 
            INNER JOIN CSKLIZR Z ON Z.KLIENTNR = K.KLIENTNR 
            WHERE P.AKTIV = 'J' AND K.LASTCHANGE >= @pLASTCHANGE 
            AND (Z.AUFNAHME IS NULL OR Z.AUFNAHME <= GetDate()) 
            AND (Z.ENTLASSUNG IS NULL OR Z.ENTLASSUNG >= GetDate()) 
      UNION 
      SELECT K.KLIENTNR, K.PROGRAMMNR, K.NAME, 
            K.VORNAME, K.[STR], K.PLZ, K.ORT , K.TELEFON1, K.TELEFON2, K.GEBDAT, K.GESCHLECHT, K.KEYKLIFR1, K.MAINVERSION 
            FROM CSKLIENT K 
            INNER JOIN H1BEW B ON B.KLIENTNR = K.KLIENTNR 
            WHERE B.AKTIV = 'J' AND ZIMMER IS NOT NULL AND BEREICH IS NOT NULL 
            AND K.LASTCHANGE >= @pLASTCHANGE 
    END 
END

So i now get the Error:

Error: [Microsoft][SQL Server Native Client 10.0][SQL Server]Warnung: Ein NULL-Wert wird durch einen Aggregat- oder sonstigen SET-Vorgang gel\224scht.

Translatet to English:

A Null value will be delete by a aggregat or a set action

My Procedure works fine if i execute it from the SQL Management Studio. The Procedure should return 222 rows. I tried to set:

sqlsrv_configure("WarningsReturnAsErrors", 0);

But then nothing was returned from the Procedure.

  • 写回答

1条回答 默认 最新

  • doutuan9357 2014-02-25 15:06
    关注

    i found the solution:

    the problem was this line in my SP:

    SET @pLASTCHANGE = (SELECT MAX(LASTCHANGE) FROM CEMITARB WHERE CEGERAETNR = @pCEGERAETNR) 
    

    LastChange can be Null and this was the problem. So i changed the code to:

    IF((SELECT DISTICT LASTCHANGE FROM CEMITARB WHERE CEGERAETNR = @pCEGERAETNR) IS NULL)
    BEGIN
         SET @pLASTCHANGE = NULL
    END
    ELSE
    BEGIN
         SET @pLASTCHANGE = (SELECT MAX(LASTCHANGE) FROM CEMITARB WHERE CEGERAETNR = @pCEGERAETNR) 
    END
    

    Now my code executes fine. And sqlsrv_query returns the correct items.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭