Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MSSQL过程未从PHP完成_Php_Sql Server_Stored Procedures_Pdo - Fatal编程技术网

MSSQL过程未从PHP完成

MSSQL过程未从PHP完成,php,sql-server,stored-procedures,pdo,Php,Sql Server,Stored Procedures,Pdo,PHP:5.4.20 Windows 服务器:Microsoft SQL Server 2012 我遇到了一个问题,从PHP脚本调用时,以下存储过程没有完全运行(但它确实运行,没有返回错误): 有没有想过为什么在第八个过程之后,但只有在通过PHP执行时才会停止此操作?尝试这种方法,虽然没有明显的不同,但值得一试 不确定这是否是输入错误,但execute()方法仅在语句对象上可用,它由prepare()返回 PHP不知道服务器内部发生了什么。它不会告诉mssql“嘿,这个存储过程?做除公制行之外的

PHP:5.4.20 Windows
服务器:Microsoft SQL Server 2012

我遇到了一个问题,从PHP脚本调用时,以下存储过程没有完全运行(但它确实运行,没有返回错误):


有没有想过为什么在第八个过程之后,但只有在通过PHP执行时才会停止此操作?

尝试这种方法,虽然没有明显的不同,但值得一试

不确定这是否是输入错误,但
execute()
方法仅在语句对象上可用,它由
prepare()
返回


PHP不知道服务器内部发生了什么。它不会告诉mssql“嘿,这个存储过程?做除公制行之外的所有事情”。PHP不可能知道存储过程中发生了什么。它只是通过字符串
EXEC并等待响应。这就是我的想法,但始终是,最后一个过程在通过PHP调用时无法运行,但在直接从MSMS执行时运行正常。这让我很困惑。我希望有SQL或PHP/PDO内部知识的人知道这可能是什么原因?奇怪的是,它没有返回任何错误。它只是省略了其中一个过程。您在php中使用的凭据是否与在mssms中使用的凭据相同?如果您尝试将单个exec与php分开运行,会发生什么?也许最后一个有一些不同的perm,php使用的帐户是不允许访问的。最初不是,但我更改了脚本,使其以我在MSMS中使用的同一用户的身份运行,它做了同样的事情。我正在考虑的一件事是重写各个过程以使用直接SQL而不是游标。不确定这是否会有什么不同,你是对的。我省略了$stmt=。。。。它应该读起来像你的代码。我做了这个更改,看到一个错误,声明“查询的活动结果不包含任何字段”。通过查找,似乎SET-NOCOUNT ON可以解决此问题。在我的例子中,它没有解决错误,但过程确实完整地运行。(我想知道我是否在所有子流程中也需要它)
CREATE PROCEDURE main_procedure (@uid int)
AS  
BEGIN
  DECLARE @NOW DATETIME
  SET @NOW = getDate()

  DELETE FROM metrics WHERE uid = @uid AND timestamp < @NOW
  EXEC update_metric_a @uid, @NOW
  EXEC update_metric_b @uid, @NOW
  EXEC update_metric_c @uid, @NOW
  EXEC update_metric_d @uid, @NOW
  EXEC update_metric_e @uid, @NOW
  EXEC update_metric_f @uid, @NOW
  EXEC update_metric_g @uid, @NOW
  EXEC update_metric_h @uid, @NOW
  EXEC update_metric_i @uid, @NOW
END
$conn = new PDO("sqlsrv:Server=######; Database=#####;", $user, $pass);
$conn->prepare("EXEC main_procedure ?");
$conn->execute(array("1234"));
try {
    $conn= new PDO("sqlsrv:Server=######; Database=#####;", $user, $pass);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $conn->prepare("EXEC dbo.main_procedure @uid = ?");
    $stmt->execute(array("1234"));
} catch (PDOException $e) {
    echo 'PDO failed: ' . $e->getMessage();
}