使用 SET 时,SQL Server 2005 T-SQL 和 PDO 没有输出


No output from SQL Server 2005 T-SQL and PDO when using SET

我正在使用PDO连接到SQL Server 2005数据库,并且在使用PHP运行某些类型的查询时没有获得输出,但是当直接在SQL Server Management Studio中运行查询时,我会这样做。

当我运行这个时:

$conn = new PDO(...);
$statement = $conn->prepare("
    DECLARE @testvar VARCHAR(10)
    SELECT 'hello world'
");
$result = $statement->execute();
echo $result ? "Success" : "Failure";
echo "<br>";
print_r($conn->errorInfo());
echo "<br>";
die(print_r($statement->fetchAll()));

我得到输出。

Success
Array ( [0] => 00000 [1] => 0 [2] => (null) [0] (severity 0) [] [3] => 0 [4] => 0 ) 
Array ( [0] => Array ( [] => hello world ) ) 1

但是,如果我更改查询以将@testvar设置为某些内容,请内联:

DECLARE @testvar VARCHAR(10) = 'test'
SELECT 'hello world'

或者使用 SET:

DECLARE @testvar VARCHAR(10)
SET @testvar = 'test'
SELECT 'hello world'

运行$statement->fetchAll()时不再"hello world",似乎没有错误:

Success
Array ( [0] => 00000 [1] => 0 [2] => (null) [0] (severity 0) [] [3] => 0 [4] => 0 ) 
Array ( ) 1

当我直接在SQL Server Management Studio中尝试上述所有三个查询时,所有三个查询都可以正常工作并正确返回"hello world"

通了。使用 SET(与DECLARE内联或作为显式SET)会导致结果现在在 PDO 术语中具有多个行集。我要查找的"hello world"字符串不在第一行集中。

取而代之的是:

die(print_r($statement->fetchAll()));

循环访问所有行集:

do {
    print_r($statement->fetchAll());
    echo "<br>";
}
while ($statement->nextRowset());

现在结果如下所示:

Array ( ) // rowset 1
Array ( [0] => Array ( [] => hello world ) )  // rowset 2