sql server — хранимая процедура SqlServer, вызываемая из php, не возвращает правильно целочисленный вывод

Я пытаюсь извлечь из хранимой процедуры в базе данных SQL Server 2008, используя функции php mssql. Код выполняется без ошибок, но я получаю странное значение, возвращаемое для одного из моих выходных параметров.

Код хранимой процедуры:

CREATE PROCEDURE [dbo].[check_barcode_and_return]
@Barcode nvarchar(20),
@IsInDatabase int OUTPUT,
@Product_Info nvarchar(100) OUTPUT

AS
SELECT @IsInDatabase = COUNT(*) FROM dbo.product_info WHERE barcode = @Barcode

DECLARE @Brand varchar(45)
SET @Brand = (SELECT brand FROM dbo.product_info WHERE barcode = @Barcode)
DECLARE @Description varchar(50)
SET @Description = (SELECT product_desc FROM dbo.product_info WHERE barcode = @Barcode)
SELECT @Product_Info = @Brand + '_' + @Description
RETURN

GO

Вот код php, который его вызывает:

<?php
// use a barcode known to be present in database
$barcode_yes = '11335577';
// use a sbarcode known NOT to be in database
$barcode_no = '0011223344';
$host = '00.000.000.000';
$db = 'dbName';
$user = 'username';
$password = 'password';
$barcodeInDB = 0;
$productInfo = "";
try {
$conn = mssql_connect($host, $user, $password);
mssql_select_db($db, $conn);
$stmt = mssql_init('check_barcode_and_return', $conn);
mssql_bind($stmt, '@Barcode', $barcode_yes, SQLVARCHAR, false, false, 20);
mssql_bind($stmt, '@IsInDatabase', $barcodeInDB, SQLINT1, true, false, 1);
mssql_bind($stmt, '@Product_Info', $productInfo, SQLVARCHAR, true, false, 100);
mssql_execute($stmt, true);
echo 'positive test results:'."\n";
echo 'output $barcodeInDB = '.$barcodeInDB."\n";
echo '$productInfo = '.$sampleInfo."\n";

//reset for next call
mssql_free_statement($stmt);
$barcodeInDB = 0;
$productInfo = "";

$stmt = mssql_init('check_barcode_and_return', $conn);
mssql_bind($stmt, '@Barcode', $barcode_no, SQLVARCHAR, false, false, 20);
mssql_bind($stmt, '@IsInDatabase', $barcodeInDB, SQLINT1, true, false, 1);
mssql_bind($stmt, '@Product_Info', $productInfo, SQLVARCHAR, true, false, 100);
mssql_execute($stmt, true);
echo 'negative test results:'."\n";
echo 'output $barcodeInTable = '.$barcodeInDB."\n";
echo '$productInfo = '.$productInfo."\n";

mssql_close($conn);
}
catch (Exception $e) {
echo $e->getMessage();
}
?>

Когда я запускаю это из командной строки, это результат:

positive test results:
output $barcodeInDB = 968529665
$productInfo = Heinz_tomato ketchup
negative test results:
output $barcodeInTable = 968529664
$productInfo = _

Если я запускаю хранимую процедуру напрямую с помощью SQL Server Management Studio, вводя использованные выше штрих-коды, я получаю @BarcodeInDB = 1 для положительного теста и @BarcodeInDB = 0 для отрицательного.

Код на сервере Linux работает Ubuntu с php5.3.10.

Что мне нужно изменить, чтобы получить правильное значение для целочисленного выходного параметра?

0

Решение

Целочисленный тип данных в мне должен был связать мой выходной параметр как SQLINT4, потому что, очевидно, целочисленные переменные T-SQL являются 4-байтовыми целыми числами. Попытка принудительно преобразовать их в тип данных с меньшей емкостью (например, SQLINT1, SQLINT2 или SQLBIT) приводит к непредсказуемому выводу.

Итак, я изменился на …

...
mssql_bind($stmt, '@IsInDatabase', $barcodeInDB, SQLINT4, true);
...

и это работало нормально.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]