Итак, я пытаюсь использовать ODBC для выполнения хранимой процедуры в базе данных SQL, но она возвращает ошибку
odbc_fetch_array() [function.odbc-fetch-array]:
SQL error: [Microsoft][ODBC SQL Server Driver]Invalid Descriptor Index,
SQL state S1002 in SQLGetData
Вот часть PHP, довольно стандартная
...
$id = 240
$user = "user";
$password = "password";
$server = "server";
$database = "database";
$con = odbc_connect("SERVER=$server;
DRIVER=SQL Server;
DATABASE=$database",
$user,
$password);
$res = odbc_exec($con, "exec usp_GetRelatedToID '$id'");
while($row = odbc_fetch_array($res)){
print_r($row);
}
Вот хранимая процедура, очень маленькая и простая
CREATE PROCEDURE [dbo].[usp_GetRelatedToID]
@id int
AS
BEGIN
SET NOCOUNT ON;
SELECT AMENDMENT_ID, WDATE, ALTERATION, VER, REASON
FROM AMENDMENTS
WHERE AMENDMENT_ID = $id
END
Вот схема Table для AMENDMENTS
(Column_name) (Type) (Nullable)
AMENDMENT_ID int no
RAD_MAIN_ID int yes
WDATE datetime yes
USR_ID int yes
ALTERATION varchar yes
REASON varchar yes
VER int yes
Identity Seed Increment Not For Replication
AMENDMENT_ID 1 1 0
constraint_type constraint_name constraint_keys
PRIMARY KEY (non-clustered) aaaaaAMENDMENTS1_PK AMENDMENT_ID
Интересно то, что она не возвращает ошибку, еслиЯ удаляю столбец VER
из процедуры
Примерно так:
CREATE PROCEDURE [dbo].[usp_GetRelatedToID]
@id int
AS
BEGIN
SET NOCOUNT ON;
SELECT AMENDMENT_ID, WDATE, ALTERATION, REASON
FROM AMENDMENTS
WHERE AMENDMENT_ID = $id
END
Может кто-нибудь объяснить, где я делаю неправильно и почему это происходит?У меня есть другие хранимые процедуры, которые выдают те же ошибки (некоторые также разделяют столбец VER
), и у меня есть хранимые процедуры, которые этого не делают.
Я пробовал разные способы полученияданные в PHP, использующие odbc_prepare
и odbc_execute
с обеими структурами запросов, {CALL usp_GetRelatedToID(?)}
, но это только дало мне больше ошибок.
И по причинам, в которые я не буду вдаваться, я не могу использовать mssqlфункции в PHP, ODBC - единственный способ, которым мне разрешено подключаться и запрашивать.
О, и выполнение простого (оригинального) запроса вместо хранимой процедуры не дает ошибок.
РЕДАКТИРОВАТЬ
$stmt = odbc_prepare($con, "{CALL usp_GetRelatedToID($id)}");
$res = odbc_execute($stmt, array());
//or
$stmt = odbc_prepare($con, "{CALL usp_GetRelatedToID(?)}");
$res = odbc_execute($stmt, array($id));
Оба возвращают это сообщение об ошибке:
Warning: odbc_execute() [function.odbc-execute]:
SQL error: [Microsoft][ODBC SQL Server Driver]Cursor type changed,
SQL state 01S02 in SQLExecute