Я получал подобные ошибки при попытке использовать PDO с использования SQLSRV до и хотел документировать процесс решения где-то так, что кто-нибудь с такой же проблемой может надеяться найти это решение.
Преобразование старого кода sql_srv для использования PDO в PHP. Оригинальный код:
$params = array(array($date, SQLSRV_PARAM_IN),array($location, SQLSRV_PARAM_IN),array(3, SQLSRV_PARAM_IN));
$result = sqlsrv_query($sqldb, "{call Some_Stored_Procedure (@base_date=?,@location=?,@plusdays=?)}", $params);
Новый код V1:
$q = "{call Some_Stored_Procedure (@base_date=?,@location=?,@plusdays=?)}";
$params = array(array($date, SQLSRV_PARAM_IN),array($location, SQLSRV_PARAM_IN),array(3, SQLSRV_PARAM_IN));
$stmt = $CONN->prepare($q);
$stmt->execute($params);
Который бросил: неперехваченное исключение 'PDOException' с сообщением «SQLSTATE [42000]: [Microsoft] [Драйвер ODBC 11 для SQL Server] [ SQL Server] Не удалось найти хранимую процедуру «Some_Stored_Procedure».
Эта ошибка была решена путем задания базы данных, как в:
$q = "{call Database.dbo.Some_Stored_Procedure (@base_date=?,@location=?,@plusdays=?)}";
$params = array(array($date, SQLSRV_PARAM_IN),array($location, SQLSRV_PARAM_IN),array(3, SQLSRV_PARAM_IN));
$stmt = $CONN->prepare($q);
$stmt->execute($params);
Но это вносило новую ошибку, и является причиной того, существует этот вопрос: Uncaught исключение «PDOException» с сообщением «SQLSTATE [42000]: [ Microsoft] [драйвер ODBC 11 для SQL Server] [SQL Server] Ошибка преобразования типа данных nvarchar в datetime. '
Попытка решить эту ошибку привела ко многим другим ошибкам (ни одна из которых не указывает на настоящую проблему!), В том числе ошибки авторов Неустранимая ошибка: исключить исключение «PDOException» с сообщением «SQLSTATE [42000]: [Microsoft] [ODBC Driver 11 для SQL Server] [SQL Server] Неверный синтаксис рядом с '@ P1'. '
Возможное решение (так же, как авторы):
$stmt = $CONN->prepare("Exec Database.dbo.Some_Stored_Procedure ?, ?, 3");
$stmt->execute(array($date, $location));
Разница (что я чувствую, что автор не стресса) в формате вызов хранимой процедуры. Вместо того, чтобы:
CALL Some_Stored_Procedure(Param1, Param2, ...);
Это
EXEC Some_Stored_Procedure Param1, Param2, ...;
Используйте EXEC вместо CALL (есть некоторые различия) и сделать не использование parenthesizes вокруг параметров.