2017-03-16 2 views
0

SQL Serverストアドプロシージャがあります。 SSMSで実行すると、312行が返されます。私はVisual FoxProコードから実行するとき。しかし、私のPHPコードで同じ呼び出しを使用すると、空の結果が得られます。空の場合は、empty()関数でテストするとtrueが返されます。 sqlsrv_has_rows()もtrueを返しますが、結果をループしようとするとループに入ることはありません。PHPから呼び出されたSQL Server SPは空の結果を返します。 Studioなどで複数の行が返される

私は同じ呼び出し構造を使用して、他のいくつかのSPで呼び出しを設定し実行しています。実際に、私が作業しているページを変更して、別のSPを呼び出すようにすると、結果が得られます。テーブルを移入するために、HTMLやPHPのミックスが続いています

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

私はここに表示どのようなコードでもわからないんだけど、ここでコールを含むページからキーコードがあります。ここで

は函機能です:

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 

EDIT:状況を簡単にするために、私は単純に(私はいくつかのケースで必要なものである)すべてのレコードを取得し、新しい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

2つのもの。 1)配列を文字列ではなく渡す必要があります。 2)文字列として渡すので、サーバーに行うときに正しい形式になっているかどうかを確認する必要があります。あなたが 'cat、dog、monkey'を渡すと、 'EXECUTE procedure' cat '、' dog '、' monkey''が実際にやっていることは 'EXECUTE procedure cat、dog、monkey'です。 – Augwa

+0

任意のパラメータを渡していないのと同様に、正しいデータベースにストアドプロシージャが開かれていることを確認してください。 – Chuck

答えて

0

解決策が見つかりました。フィールドリストの最後のフィールドは複雑な式です(基本的に "月、年"の文字列を作成します)。偶然、私はASを使ってフィールドに名前を与えていませんでした。私がしたら、それはすべて動作します。

これは、sqlsrvライブラリがPHP側でプロパティ名を生成するためにフィールド名を使用していることと、問題を引き起こしていたデフォルトのSQL Serverが何であってもそれが失敗するというものです。

関連する問題