从PHP调用的SQL Server SP返回空结果;在工作室和其他地方,返回多行

从PHP调用的SQL Server SP返回空结果;在工作室和其他地方,返回多行

问题描述:

我有一个SQL Server存储过程。当我在SSMS中运行它时,它返回312行;同样,当我从Visual FoxPro代码运行它时。但是当我在我的PHP代码中使用相同的调用时,我得到一个空的结果。空,我的意思是用empty()函数测试它返回true; sqlsrv_has_rows()也返回true,但是当我试图循环结果时,我从不进入循环。从PHP调用的SQL Server SP返回空结果;在工作室和其他地方,返回多行

我使用相同的调用结构来设置和执行与其他几个SP的调用,他们的工作。事实上,如果我修改正在处理的页面,以便它调用不同的SP,我会得到结果。

我什至不知道在这里展示一下代码,但这里是从包含调用页面关键代码:

<?php 
$articles = getdata("GetArticles","'','',''"); 
while($obj = sqlsrv_fetch_object($articles)) { 
?> 

这是其次是HTML和PHP的组合,以形成一个表。

这里的的GetData功能:

function getdata($spname, $params, $errorstring = 'Unable to retrieve requested data') { 
$conn = connect2db(); 
$query = "EXECUTE ".$spname; 
if (!$params == '') { 
    $query .= " ".$params; 
} 
//echo "query = ".$query."\r\n"; 
$result = sqlsrv_query($conn, $query); 
//echo "result = ".$result."\r\n"; 

if ($result == false) { 
    $errors = sqlsrv_errors(); 
    foreach ($errors as $error) { 
     echo $error['message']; 
    } 
    die(print_r(sqlsrv_errors(), true)); 
} 

return $result; 

} 

connecttodb是另一个函数,实际上使数据库连接。这绝对有用。

SP是一个查询。

ALTER PROCEDURE [XXXXXX].[GetArticles] 
    -- Add the parameters for the stored procedure here 
    @Pubs char(400) = '', 
    @Types char(400) = '', 
    @Years char(400) = '' 
AS 

BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

-- Insert statements for procedure here 
SELECT Article.Title, 
     ArticleType.Name AS ArticleType, 
     URL, 
     Publication.Title AS Publication, 
     DateName(m, DATEFROMPARTS(Article.[Year], Article.[Month], 1)) + ', ' + CONVERT(char(4), [Year]) 
    FROM Article 
     JOIN ArticleType 
     ON Article.iTypeID = ArticleType.iID 
     JOIN Publication 
     ON Article.iMagazineID = Publication.iID 
    WHERE (@Pubs = '' 
      OR iMagazineID IN 
      (SELECT * FROM Split(@Pubs, ','))) 
     AND (@Types = '' 
      OR iTypeID IN 
      (SELECT * FROM Split(@Types, ','))) 
     AND (@Years = '' 
      OR CONVERT(CHAR(4), [Year]) IN 
      (SELECT * FROM Split(@Years, ','))) 
    ORDER BY [Year] DESC, [Month] DESC    
END 

编辑:为了简化情况,我创建一个不带参数只是检索所有记录(这是我需要在某些情况下),并修改了页面调用新的SP新的SP。和以前一样,SP在SSMS中工作,但没有检索到有用的记录。

我还需要澄清,似乎我得到一个记录,但它完全是空的。具体来说,为了测试,我在调用SP后添加了以下代码:

if (is_null($articles)) { 
    echo "Null return"; 
} 
else { 
    $obj = sqlsrv_fetch_object($articles); 
    if (is_null($obj)) { 
     echo "First object is null"; 
    } 
    else { 
     if (empty($obj)) { 
      echo "First object is empty"; 
     } 
    } 

在页面上回显的是“第一个对象为空”。 }

+0

显示您传递的确切参数以及如何在SSMS中运行它。 – DavidG

+0

两件事。 1)你应该把你的params作为一个数组而不是一个字符串。 2)因为你把它作为一个字符串传递,这意味着你需要确保在对服务器进行正确格式化时。所以,如果你通过'猫,狗,猴',你可能希望它执行'执行程序'猫','狗','猴子'它实际上在做什么'执行程序猫,狗,猴子' – Augwa

+0

它看起来就像你没有传递任何参数一样,也要确保你在正确的数据库中打开存储过程。 – Chuck

我找到了解决方案。字段列表中的最后一个字段是一个复杂的表达式(基本上构建“月,年”字符串)。无意中,我没有使用AS给这个字段命名。一旦我做到了,一切都会奏效。

我为什么会失败的猜测是sqlsrv库正在使用字段名称来生成PHP端的属性名称,以及提供的任何默认SQL Server都会导致问题。