2

私はこれについて正直な答えを得ることができないようです。

SQLSRVデータベースでタイプnvarchar(MAX)のフィールドのコンテンツをフェッチしていますが、コンテンツではなくクエリから返されたフィールドの結果をエコーすると、「リソースID#1」が取得され続けます。私はSQLSRVとPHPにかなり慣れていませんが、私が理解していることから、この値は、実際に必要なコンテンツがどこにあるかを示すポインターですか?

もしそうなら、どうすればこのデータを取得できますか。

私が試してみました:

$sql = "SELECT * FROM table";
    $stmt= sqlsrv_query($conn, $sql, array(), array("Scrollable" => SQLSRV_CURSOR_STATIC));

$getNext = sqlsrv_fetch($stmt);
$result = sqlsrv_get_field($stmt, 1); // this is the nvarchar(max) field

echo $result; // this shows Resource id #1;

// I tried
//$resource = sqlsrv_fetch($result); // this creates errors

ありがとうございました。

4

1 に答える 1

1

NVARCHAR(MAX)は、ストレージに関する懸念事項を処理し、テーブルに約4000文字未満のものを格納しますが、テーブル内のポインターを使用して別の場所にそれ以上のものを格納します。幸いなことに、SQL Serverは、返されたデータをテーブルに格納されているかのように表示するため、NVARCHAR(MAX)の使用が問題の原因になることはなく、通常のテーブルフィールドと同じように機能します。

これを見つけたばかりで、役立つかもしれません...

/*Get the second field of the row as a stream.
Because the default return type for a nvarchar field is a
string, the return type must be specified as a stream. */
$stream = sqlsrv_get_field( $stmt, 1, 
                            SQLSRV_PHPTYPE_STREAM( SQLSRV_ENC_CHAR));
while( !feof( $stream))
{ 
    $str = fread( $stream, 10000);
    echo $str;
}

http://msdn.microsoft.com/en-us/library/cc296207(v=sql.105).aspx

于 2012-05-04T14:39:06.090 に答える