Пояснения:
Причина вашей ошибки в том, что BACKUP DATABASE
возвращает информационные сообщения, а ваша хранимая процедура имеет несколько наборов результатов.Я воспроизвел вашу ошибку с помощью тестового сценария (хотя в вашем вопросе я не вижу, как вы готовите хранимую процедуру).Вы можете попробовать одно из следующих решений (я создал простые сценарии, которые вы можете легко реализовать в своих функциях).
вызов PDOStatement :: nextRowset чтобы получить каждый набор результатов (в данном случае два дополнительных вызова)
используйте параметр OUTPUT
в вашей хранимой процедуре.В этом случае вам нужно получить все наборы результатов, а затем получить значение выходного параметра.
Решение 1:
Сохраненопроцедура:
create procedure [dbo].[sp_IWBackup]
as
begin
declare
@route varchar(500),
@answer int = 0
set nocount on
set @route = 'I:\route'+(replace((replace(convert(varchar, getdate(), 21),':',';')),'.',';'))+'Full.bak'
set @answer = 1
begin try
backup database databasename to disk = @route
end try
begin catch
set @answer = 0
end catch
select @answer as answer
end
PHP:
<?php
$server = 'server\instance,port';
$database = 'database';
$uid = 'uid';
$pwd = 'pww';
try {
$dbh = new PDO("sqlsrv:server=$server;Database=$database", $uid, $pwd);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch( PDOException $e ) {
die("Error connecting to SQL Server. ".$e->getMessage());
}
try {
$sql = "{CALL sp_IWBackup}";
$stmt = $dbh->prepare($sql);
$stmt->execute();
$stmt->nextRowset();
$stmt->nextRowset();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
foreach ($row as $key => $value) {
echo $key.": ".$value."<br>";
};
}
} catch( PDOException $e ) {
die( "Error executing stored procedure: ".$e->getMessage());
}
$stmt = null;
$dbh = null;
?>
Решение 2:
Хранимая процедура:
create procedure [dbo].[sp_IWBackupOut]
@answer int OUTPUT
as
begin
declare
@route varchar(500)
set nocount on
set @route = 'I:\route'+(replace((replace(convert(varchar, getdate(), 21),':',';')),'.',';'))+'Full.bak'
set @answer = 1
begin try
backup database databasename to disk = @route
end try
begin catch
set @answer = 0
end catch
end
PHP:
<?php
$server = 'server\instance,port';
$database = 'database';
$uid = 'uid';
$pwd = 'pww';
try {
$dbh = new PDO("sqlsrv:server=$server;Database=$database", $uid, $pwd);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch( PDOException $e ) {
die("Error connecting to SQL Server. ".$e->getMessage());
}
try {
$sql = "{CALL sp_IWBackupOut (?)}";
$stmt = $dbh->prepare($sql);
$answer = -1;
$stmt->bindParam(1, $answer, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT, PDO::SQLSRV_PARAM_OUT_DEFAULT_SIZE);
$stmt->execute();
do {
} while ($stmt->nextRowset());
echo "answer: ".$answer;
} catch( PDOException $e ) {
die( "Error executing stored procedure: ".$e->getMessage());
}
$stmt = null;
$dbh = null;
?>