php - 如何执行一个sqlsrv存储过程
php - how execute a sqlsrv stored procedure
我在 PHP 脚本中使用 SQLSRV 成功连接到 SQL 服务器:
$name = 'SERVERNAME';
$db = 'DBNAME';
$par = array("Database"=>$db);
$conn = sqlsrv_connect($name, $par);
我还有以下 T-SQL 脚本:
Declare @dt datetime;
SET @dt = GETDATE();
EXEC oik..SrezLTGES @Cat = 'Ë', @Ids = '140539,140540,140589,150395,180395,180396,180445',@Time = @dt
程序参数为:
我不知道如何在 PHP 中执行此查询。有什么想法吗?
此处一种可能的方法是将语句参数化并使用 sqlsrv_query()
。正如documentation中提到的,sqlsrv_query函数非常适合一次性查询,应该是执行查询的默认选择,除非特殊情况适用而sqlsrv_query函数既做语句准备又做语句执行,可用于执行参数化查询.
存储过程有 varchar
个参数(我几乎可以肯定,您使用的是西里尔字母排序规则),因此您可能需要使用适当的编码("CharacterSet" => "UTF-8"
或 "CharacterSet" => SQLSRV_ENC_CHAR
在连接选项中) and/or 参数值的字符集转换(以 iconv()
为例)。阅读 UTF-8 all the way through 是一个很好的起点。
如果存储过程有returns数据,可以尝试用sqlsrv_fetch_array()
取回返回的数据。您还可以使用 SET NOCOUNT ON
来防止 SQL 服务器将受影响行的计数作为结果集的一部分传递。
以下示例基于您的代码,是您问题的可能解决方案:
<?php
// Connection
$server = "SERVERNAME";
$database = "DBNAME";
$cinfo = array(
"CharacterSet" => "UTF-8",
"Database" => $database
);
$con = sqlsrv_connect($server, $cinfo);
if ($con === false) {
echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
exit;
}
// Statement
$sql = "
SET NOCOUNT ON;
DECLARE @dt datetime;
SET @dt = GETDATE();
EXEC oik..SrezLTGES
@Cat = ?,
@Ids = ?,
@Time = @dt,
@TimeIsSummer = 1,
@ShowSystemTime = 1
";
$params = array("Ë", "140539,140540,140589,150395,180395,180396,180445");
$stmt = sqlsrv_query($con, $sql, $params);
if ($stmt === false) {
echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
exit;
}
// Data
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
echo print_r($row, true);
}
// End
sqlsrv_free_stmt($stmt);
sqlsrv_close($con);
?>
我在 PHP 脚本中使用 SQLSRV 成功连接到 SQL 服务器:
$name = 'SERVERNAME';
$db = 'DBNAME';
$par = array("Database"=>$db);
$conn = sqlsrv_connect($name, $par);
我还有以下 T-SQL 脚本:
Declare @dt datetime;
SET @dt = GETDATE();
EXEC oik..SrezLTGES @Cat = 'Ë', @Ids = '140539,140540,140589,150395,180395,180396,180445',@Time = @dt
程序参数为:
我不知道如何在 PHP 中执行此查询。有什么想法吗?
此处一种可能的方法是将语句参数化并使用 sqlsrv_query()
。正如documentation中提到的,sqlsrv_query函数非常适合一次性查询,应该是执行查询的默认选择,除非特殊情况适用而sqlsrv_query函数既做语句准备又做语句执行,可用于执行参数化查询.
存储过程有 varchar
个参数(我几乎可以肯定,您使用的是西里尔字母排序规则),因此您可能需要使用适当的编码("CharacterSet" => "UTF-8"
或 "CharacterSet" => SQLSRV_ENC_CHAR
在连接选项中) and/or 参数值的字符集转换(以 iconv()
为例)。阅读 UTF-8 all the way through 是一个很好的起点。
如果存储过程有returns数据,可以尝试用sqlsrv_fetch_array()
取回返回的数据。您还可以使用 SET NOCOUNT ON
来防止 SQL 服务器将受影响行的计数作为结果集的一部分传递。
以下示例基于您的代码,是您问题的可能解决方案:
<?php
// Connection
$server = "SERVERNAME";
$database = "DBNAME";
$cinfo = array(
"CharacterSet" => "UTF-8",
"Database" => $database
);
$con = sqlsrv_connect($server, $cinfo);
if ($con === false) {
echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
exit;
}
// Statement
$sql = "
SET NOCOUNT ON;
DECLARE @dt datetime;
SET @dt = GETDATE();
EXEC oik..SrezLTGES
@Cat = ?,
@Ids = ?,
@Time = @dt,
@TimeIsSummer = 1,
@ShowSystemTime = 1
";
$params = array("Ë", "140539,140540,140589,150395,180395,180396,180445");
$stmt = sqlsrv_query($con, $sql, $params);
if ($stmt === false) {
echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
exit;
}
// Data
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
echo print_r($row, true);
}
// End
sqlsrv_free_stmt($stmt);
sqlsrv_close($con);
?>