【发布时间】:2015-07-29 19:01:13
【问题描述】:
我在 SQL Server 2012 中有一个存储过程,它首先检查数据是否存在,如果存在,则将输出参数 @Return 设置为 1 并运行选择查询,如果不存在,则将 @Return 设置为 0 并返回一个不同的选择查询。
在测试此存储过程以确保数据准确时,它是完美的并返回我期望的数据。问题出在 PHP 端,当它试图读取它显示的输出参数时,它应该显示 1 或 0 时显示 ��t_rrr。我相信问题可能出在 sqlsrv_query 中的预定义常量中,但我似乎无法得到它在职的。这是我的代码:
PHP:
if(isset($_GET['accno'])) {
$search = $_GET['accno'];
$return = "";
$tsql_callSP = "EXEC Intranet.CustomerSearch @Search=?, @Return=?";
$params = array(
array($search, SQLSRV_PARAM_IN),
array($return, SQLSRV_PARAM_OUT, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_CHAR),SQLSRV_SQLTYPE_INT),
);
/* Execute the query. */
$stmt = sqlsrv_query( $conn, $tsql_callSP, $params);
if( $stmt === false )
{
echo "EXEC Intranet.CustomerSearch Failed\n";
die( print_r( sqlsrv_errors(), true));
}
while($res = sqlsrv_next_result($stmt))
{
// make sure all result sets are stepped through,
// since the output params may not be set until this happens
}
echo $return;
if($return == 0) { ?>
//1st Result Set
while($row = sqlsrv_fetch_array($stmt)) {
}
<?php } elseif($return == 1) { // End if Return 0 ?>
//2nd Result Set
while($row = sqlsrv_fetch_array($stmt)) {
}
<?php } // End if Return 1 ?>
SQL 存储过程:
USE [Intranet]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [Intranet].[CustomerSearch]
@Search nvarchar(10)
,@Return int output
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS
(
SELECT KeyCode
FROM Autopart.dbo.Customer
WHERE KeyCode = @Search
)
BEGIN
SELECT
Customer.KeyCode
,Customer.X13
,Customer.Name
,Customer.Addra
,Customer.Addrb
,Customer.Addrc
,Customer.Addrd
,Customer.Addre
,Customer.PCode
,Customer.CTitle
,Customer.Climit
,Customer.Ptype
,Customer.Stel
,Customer.SCont
,Customer.ACont
,Customer.XString5
,Customer.Locked
,Customer.Email
,Customer.StopStatus
,CusNotes.Comment
FROM
Autopart.dbo.Customer
LEFT OUTER JOIN Autopart.dbo.CusNotes ON Autopart.dbo.Customer.KeyCode = Autopart.dbo.CusNotes.Account
WHERE
(Customer.KeyCode = @Search)
AND (CusNotes.Seqno = 1 OR CusNotes.Seqno IS NULL)
SET @Return = 1
END ELSE BEGIN
SELECT TOP 100
KeyCode
,Name
,PCode
,Addra
,Addrb
,Addrc
FROM
AUTOPART.dbo.Customer
WHERE
(KeyCode LIKE '%'+@Search+'%'
OR Name LIKE '%'+@Search+'%'
OR PCode LIKE '%'+@Search+'%')
SET @Return = 0
END
END
我已尝试更改 PHP 和 SQL 类型,但无法获得所需的结果。奇怪的是,如果我创建一个存储过程,它是 INSERT 或 UPDATE 语句,OUTPUT 会正确返回。
编辑:
SQL Server 存储过程排序规则是 Latin1_General_CI_AS
【问题讨论】:
-
尝试:
$return = 0;代替$return = "";和SQLSRV_PARAM_INOUT代替SQLSRV_PARAM_OUT和SQLSRV_PHPTYPE_INT(SQLSRV_ENC_BINARY)代替SQLSRV_PHPTYPE_STRING。 -
按照建议更改
$return变量,将参数类型更改为SQLRV_PARAM_INOUT,将PHPTYPE 更改为array($return, SQLSRV_PARAM_INOUT, SQLSRV_PHPTYPE_INT,SQLSRV_SQLTYPE_INT),现在无论查询如何,我总是返回0(虽然没有愚蠢的字符)和@ 987654338@ 检测为 ASCII
标签: php sql sql-server stored-procedures sqlsrv