SQLSRV NULL値は集約またはセットによって削除されます。
質問
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は正しい項目を返します。
所属していません StackOverflow