Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Cria um recurso de instrução associado à ligação especificada. Esta função é útil para a execução de múltiplas consultas.
Syntax
sqlsrv_prepare(resource $conn, string $tsql [, array $params [, array $options]])
Parameters
$conn: O recurso de ligação associado à declaração criada.
$tsql: A expressão Transact-SQL que corresponde à afirmação criada.
$params [OPCIONAL]: Um array de valores que correspondem a parâmetros numa consulta parametrizada. Cada elemento do array pode ser um dos seguintes:
Um valor literal.
Uma referência a uma variável PHP.
Um array com a seguinte estrutura:
array(&$value [, $direction [, $phpType [, $sqlType]]])Note
As variáveis passadas como parâmetros de consulta devem ser passadas por referência em vez de por valor. Por exemplo, passar
&$myVariableem vez de$myVariable. Um aviso PHP é gerado quando uma consulta com parâmetros por valor é executada.A tabela seguinte descreve estes elementos do array:
Elemento Description &$value Um valor literal ou uma referência a uma variável PHP. $direction[OPCIONAL] Uma das seguintes constantes SQLSRV_PARAM_* é usada para indicar a direção do parâmetro: SQLSRV_PARAM_IN, SQLSRV_PARAM_OUT, SQLSRV_PARAM_INOUT. O valor padrão é SQLSRV_PARAM_IN.
Para mais informações sobre constantes PHP, consulte Constantes (Microsoft Drivers for PHP for SQL Server).$phpType[OPCIONAL] Uma constante SQLSRV_PHPTYPE_* que especifica o tipo de dado PHP do valor devolvido. $sqlType[OPCIONAL] Uma constante SQLSRV_SQLTYPE_* que especifica o tipo de dado SQL Server do valor de entrada.
$options [OPCIONAL]: Um array associativo que define propriedades de consulta. A tabela seguinte lista as chaves suportadas e os valores correspondentes:
| Key | Valores suportados | Description |
|---|---|---|
| ClientBufferMaxKBSize | Um número inteiro positivo | Configura o tamanho do buffer que contém o conjunto de resultados para um cursor do lado do cliente. O padrão é 10240 KB. Para mais informações, leia Especificar um Tipo de Cursor e Selecionar Linhas. |
| DecimalPlaces | Um inteiro entre 0 e 4 (inclusive) | Especifica as casas decimais ao formatar valores monetários obtidos. Qualquer valor negativo inteiro ou maior que 4 será ignorado. Esta opção só funciona quando o FormatDecimals é verdadeiro. |
| FormatDecimals |
verdadeiro ou falso O valor predefinido é falso. |
Especifica se deve adicionar zeros iniciais às cadeias decimais quando apropriado e permite a DecimalPlaces opção de formatar tipos de moeda.Para mais informações, consulte Formatação de Cadeias Decimais e Valores de Dinheiro (Driver SQLSRV). |
| QueryTimeout | Um número inteiro positivo | Define o tempo limite da consulta em segundos. Por defeito, o condutor espera indefinidamente pelos resultados. |
| RetornarDatasComoStrings |
verdadeiro ou falso O valor predefinido é falso. |
Configura a instrução para recuperar tipos de data e hora como cadeias (true). Para mais informações, leia Como: Recuperar Tipos de Data e Hora como Strings usando o driver SQLSRV. |
| Rolável | SQLSRV_CURSOR_FORWARD SQLSRV_CURSOR_STATIC SQLSRV_CURSOR_DYNAMIC SQLSRV_CURSOR_KEYSET SQLSRV_CURSOR_CLIENT_BUFFERED |
Para mais informações sobre estes valores, consulte Especificar um Tipo de Cursor e Selecionar Linhas. |
| SendStreamParamsAtExec |
verdadeiro ou falso O valor padrão é true. |
Configura o driver para enviar todos os dados do fluxo na execução (verdadeiro), ou para enviar os dados do fluxo em blocos (falso). Por defeito, o valor é definido como verdadeiro. Para mais informações, consulte sqlsrv_send_stream_data. |
Valor de retorno
Um recurso para declarações. Se o recurso da instrução não puder ser criado, o false é devolvido.
Remarks
Quando se prepara uma instrução que usa variáveis como parâmetros, as variáveis estão ligadas à sentença. Isto significa que, se atualizar os valores das variáveis, da próxima vez que executar a instrução será executada com valores de parâmetros atualizados.
A combinação de sqlsrv_prepare e sqlsrv_execute separa a preparação e execução da sentação em duas chamadas de função e pode ser usada para executar consultas parametrizadas. Esta função é ideal para executar uma instrução várias vezes com valores de parâmetro diferentes para cada execução.
Para estratégias alternativas para escrever e ler grandes quantidades de informação, veja Lotes de Instruções SQL e BULK INSERT.
Para mais informações, veja Como: Recuperar Parâmetros de Saída Usando o Driver SQLSRV.
Exemplo 1
O exemplo seguinte prepara e executa uma instrução. A instrução, quando executada (ver sqlsrv_execute), atualiza um campo na tabela Sales.SalesOrderDetail da base de dados AdventureWorks. O exemplo assume que o SQL Server e a base de dados AdventureWorks estão instalados no computador local. Toda a saída é escrita para a consola quando o exemplo é executado a partir da linha de comandos.
<?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 Transact-SQL query. */
$tsql = "UPDATE Sales.SalesOrderDetail
SET OrderQty = ?
WHERE SalesOrderDetailID = ?";
/* Assign parameter values. */
$param1 = 5;
$param2 = 10;
$params = array(&$param1, &$param2);
/* Prepare the statement. */
if ($stmt = sqlsrv_prepare($conn, $tsql, $params)) {
echo "Statement prepared.\n";
} else {
echo "Statement could not be prepared.\n";
die(print_r(sqlsrv_errors(), true));
}
/* Execute the statement. */
if (sqlsrv_execute($stmt)) {
echo "Statement executed.\n";
} else {
echo "Statement could not be executed.\n";
die(print_r(sqlsrv_errors(), true));
}
/* Free the statement and connection resources. */
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
Exemplo 2
O exemplo seguinte demonstra como preparar uma instrução e depois reexecutá-la com diferentes valores de parâmetro. O exemplo atualiza a coluna OrderQty da tabela Sales.SalesOrderDetail na base de dados AdventureWorks. Após as atualizações, a base de dados é consultada para verificar se as atualizações foram bem-sucedidas. O exemplo assume que o SQL Server e a base de dados AdventureWorks estão instalados no computador local. Toda a saída é escrita para a consola quando o exemplo é executado a partir da linha de comandos.
<?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));
}
/* Define the parameterized query. */
$tsql = "UPDATE Sales.SalesOrderDetail
SET OrderQty = ?
WHERE SalesOrderDetailID = ?";
/* Initialize parameters and prepare the statement. Variables $qty
and $id are bound to the statement, $stmt1. */
$qty = 0; $id = 0;
$stmt1 = sqlsrv_prepare($conn, $tsql, array(&$qty, &$id));
if ($stmt1) {
echo "Statement 1 prepared.\n";
} else {
echo "Error in statement preparation.\n";
die(print_r(sqlsrv_errors(), true));
}
/* Set up the SalesOrderDetailID and OrderQty information. This array
maps the order ID to order quantity in key=>value pairs. */
$orders = array(1=>10, 2=>20, 3=>30);
/* Execute the statement for each order. */
foreach ($orders as $id => $qty) {
// Because $id and $qty are bound to $stmt1, their updated
// values are used with each execution of the statement.
if (sqlsrv_execute($stmt1) === false) {
echo "Error in statement execution.\n";
die(print_r(sqlsrv_errors(), true));
}
}
echo "Orders updated.\n";
/* Free $stmt1 resources. This allows $id and $qty to be bound to a different statement.*/
sqlsrv_free_stmt($stmt1);
/* Now verify that the results were successfully written by selecting
the newly inserted rows. */
$tsql = "SELECT OrderQty
FROM Sales.SalesOrderDetail
WHERE SalesOrderDetailID = ?";
/* Prepare the statement. Variable $id is bound to $stmt2. */
$stmt2 = sqlsrv_prepare($conn, $tsql, array(&$id));
if ($stmt2) {
echo "Statement 2 prepared.\n";
} else {
echo "Error in statement preparation.\n";
die(print_r(sqlsrv_errors(), true));
}
/* Execute the statement for each order. */
foreach (array_keys($orders) as $id)
{
/* Because $id is bound to $stmt2, its updated value
is used with each execution of the statement. */
if (sqlsrv_execute($stmt2)) {
sqlsrv_fetch($stmt2);
$quantity = sqlsrv_get_field($stmt2, 0);
echo "Order $id is for $quantity units.\n";
} else {
echo "Error in statement execution.\n";
die(print_r(sqlsrv_errors(), true));
}
}
/* Free $stmt2 and connection resources. */
sqlsrv_free_stmt($stmt2);
sqlsrv_close($conn);
?>
Note
Recomenda-se usar cadeias de caracteres como entradas ao ligar valores a uma coluna decimal ou numérica para garantir precisão e exatidão, pois o PHP tem precisão limitada para números de ponto flutuante. O mesmo se aplica às colunas bigint, especialmente quando os valores estão fora do intervalo de um inteiro.
Exemplo 3
Este exemplo de código mostra como atribuir um valor decimal como parâmetro de entrada.
<?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_prepare($conn, "INSERT INTO TestTable (DecimalCol) VALUES (?)", $params);
sqlsrv_execute($stmt);
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
Ver também
Referência da API do Driver SQLSRV
Como: Realizar Consultas Parametrizadas
Sobre Exemplos de Código na Documentação
Atualização de Dados (Microsoft Drivers para PHP para SQL Server)