sqlsrv_query
ステートメントを準備して実行します。
構文
sqlsrv_query(resource $conn, string $tsql [, array $params [, array $options]])
パラメーター
$conn:準備済みステートメントに関連付けられた接続リソースです。
$tsql: 準備済みステートメントに対応する Transact-SQL 式です。
$params [省略可能]: パラメーター化されたクエリのパラメーターに対応する値の配列です。 配列の各要素には、次のいずれかを指定できます。
リテラル値。
PHP 変数。
次の構造を持つ 配列 。
array($value [, $direction [, $phpType [, $sqlType]]])
次の表で配列の各要素を説明します。
要素 説明 $value リテラル値、PHP 変数、または PHP by-reference 変数。 $direction[オプション] パラメーターの方向を示すために使用する SQLSRV_PARAM_* 定数 (SQLSRV_PARAM_IN、SQLSRV_PARAM_OUT、SQLSRV_PARAM_INOUT) のいずれか。 既定値は SQLSRV_PARAM_IN です。
PHP 定数の詳細については、「定数 (Microsoft Drivers for PHP for SQL Server)」を参照してください。$phpType[オプション] 戻り値の PHP データ型を指定する SQLSRV_PHPTYPE_* 定数。
PHP 定数の詳細については、「定数 (Microsoft Drivers for PHP for SQL Server)」を参照してください。$sqlType[オプション] 入力値の SQL Server データ型を指定する SQLSRV_SQLTYPE_* 定数。
PHP 定数の詳細については、「定数 (Microsoft Drivers for PHP for SQL Server)」を参照してください。
$options [省略可能]: クエリのプロパティを設定する連想配列。 それは、sqlsrv_prepare でサポートされるキーの一覧と同じです。
戻り値
ステートメント リソースです。 ステートメントを作成または実行できない場合、false が返されます。
解説
sqlsrv_query 関数は 1 回限りのクエリに最適であり、特殊な状況を除き、クエリを実行するための既定の選択となります。 この関数は、最小限のコードでクエリを実行するための簡素化されたメソッドを提供します。 sqlsrv_query 関数はステートメントの準備と実行の両方を行い、パラメーター化されたクエリの実行に使用できます。
詳細については、「SQLSRV ドライバーを使用して出力パラメーターを取得する」を参照してください。
例 1
次の例では、AdventureWorks データベースの Sales.SalesOrderDetail テーブルに 1 つの行を挿入します。 この例では、ローカル コンピューターに SQL Server および AdventureWorks データベースがインストールされていることを前提にしています。 コマンド ラインからこの例を実行すると、すべての出力はコンソールに書き込まれます。
Note
次の例では、1 回限りのステートメントの実行に sqlsrv_query を使用する方法を示すために INSERT ステートメントを使用していますが、概念は任意の Transact-SQL ステートメントに当てはまります。
<?php
/* Connect to the local server using Windows Authentication and
specify the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array("Database"=>"AdventureWorks");
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
echo "Could not connect.\n";
die(print_r(sqlsrv_errors(), true));
}
/* Set up the parameterized query. */
$tsql = "INSERT INTO Sales.SalesOrderDetail
(SalesOrderID,
OrderQty,
ProductID,
SpecialOfferID,
UnitPrice,
UnitPriceDiscount)
VALUES
(?, ?, ?, ?, ?, ?)";
/* Set parameter values. */
$params = array(75123, 5, 741, 1, 818.70, 0.00);
/* Prepare and execute the query. */
$stmt = sqlsrv_query($conn, $tsql, $params);
if ($stmt) {
echo "Row successfully inserted.\n";
} else {
echo "Row insertion failed.\n";
die(print_r(sqlsrv_errors(), true));
}
/* Free statement and connection resources. */
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
例 2
次の例では、AdventureWorks データベースの Sales.SalesOrderDetail テーブルのフィールドを更新します。 この例では、ローカル コンピューターに SQL Server および AdventureWorks データベースがインストールされていることを前提にしています。 コマンド ラインからこの例を実行すると、すべての出力はコンソールに書き込まれます。
<?php
/* Connect to the local server using Windows Authentication and
specify the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array("Database"=>"AdventureWorks");
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
echo "Could not connect.\n";
die(print_r(sqlsrv_errors(), true));
}
/* Set up the parameterized query. */
$tsql = "UPDATE Sales.SalesOrderDetail
SET OrderQty = (?)
WHERE SalesOrderDetailID = (?)";
/* Assign literal parameter values. */
$params = array(5, 10);
/* Execute the query. */
if (sqlsrv_query($conn, $tsql, $params)) {
echo "Statement executed.\n";
} else {
echo "Error in statement execution.\n";
die(print_r(sqlsrv_errors(), true));
}
/* Free connection resources. */
sqlsrv_close($conn);
?>
Note
値を 10 進数列または数値列にバインドするときは、有効桁数と精度を保持するために、入力として文字列を使用することをお勧めします。これは、PHP には浮動小数点数の有効桁数に制限があるためです。 値が整数の範囲外にある場合は特に、同じことが bigint 列にも適用されます。
例 3
このコード サンプルでは、入力パラメーターとして 10 進数値をバインドする方法を示しています。
<?php
$serverName = "(local)";
$connectionInfo = array("Database"=>"YourTestDB");
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
echo "Could not connect.\n";
die(print_r(sqlsrv_errors(), true));
}
// Assume TestTable exists with a decimal field
$input = "9223372036854.80000";
$params = array($input);
$stmt = sqlsrv_query($conn, "INSERT INTO TestTable (DecimalCol) VALUES (?)", $params);
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
例 4
このコード例では、sql_variant 型のテーブルを作成し、挿入されたデータをフェッチする方法を示しています。
<?php
$server = 'serverName';
$dbName = 'databaseName';
$uid = 'yourUserName';
$pwd = 'yourPassword';
$options = array("Database"=>$dbName, "UID"=>$uid, "PWD"=>$pwd);
$conn = sqlsrv_connect($server, $options);
if($conn === false) {
die(print_r(sqlsrv_errors(), true));
}
$tableName = 'testTable';
$query = "CREATE TABLE $tableName ([c1_int] sql_variant, [c2_varchar] sql_variant)";
$stmt = sqlsrv_query($conn, $query);
if($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
sqlsrv_free_stmt($stmt);
$query = "INSERT INTO [$tableName] (c1_int, c2_varchar) VALUES (1, 'test_data')";
$stmt = sqlsrv_query($conn, $query);
if($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
sqlsrv_free_stmt($stmt);
$query = "SELECT * FROM $tableName";
$stmt = sqlsrv_query($conn, $query);
if(sqlsrv_fetch($stmt) === false) {
die(print_r(sqlsrv_errors(), true));
}
$col1 = sqlsrv_get_field($stmt, 0);
echo "First field: $col1 \n";
$col2 = sqlsrv_get_field($stmt, 1);
echo "Second field: $col2 \n";
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
予想される出力は次のようになります。
First field: 1
Second field: test_data
参照
方法: パラメーター化クエリを実行する」を参照してください。