SQLSRV NULL値は集約またはセットによって削除されます。

StackOverflow https://stackoverflow.com//questions/22008332

  •  21-12-2019
  •  | 
  •  

質問

PHPからストアドプロシージャを実行するための

i。私の他のSPは正しく機能しています。しかし、これは問題を作ります。

これは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); 
                    } 
            }
.

これは私の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
.

だから私は今エラーを得る:

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英語:

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

SQL Management Studioからそれを実行した場合、私の手順はうまく機能します。 手順は222行を返すべきです。 私は設定しようとしました:

sqlsrv_configure("WarningsReturnAsErrors", 0);
.

しかし、手順から何も返されなかった。

役に立ちましたか?

解決

私は解決策を見つけた:

問題は私のSPのこの行でした:

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

LastChangeはNULLになり、これが問題でした。 だから私はコードを変更しました:

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
.

今すぐ私のコードは大丈夫です。そしてSQLSRV_QUERYは正しい項目を返します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top