sqlsrv_prepare

Baixar o driver PHP

Cria um recurso de instrução associado à conexão especificada. Essa função é útil para a execução de várias consultas.

Sintaxe

  
sqlsrv_prepare(resource $conn, string $tsql [, array $params [, array $options]])  

Parâmetros

$conn: o recurso de conexão associado à instrução preparada.

$tsql: a expressão Transact-SQL que corresponde à instrução criada.

$params [OPTIONAL]: uma matriz de valores que correspondem aos parâmetros em uma consulta parametrizada. Cada elemento da matriz pode ser um dos seguintes:

  • Um valor literal.

  • Uma referência a uma variável do PHP.

  • Uma matriz com a seguinte estrutura:

    array(&$value [, $direction [, $phpType [, $sqlType]]])  
    

    Observação

    Variáveis passadas como parâmetros de consulta devem ser passadas por referência em vez de por valor. Por exemplo, passe &$myVariable em vez de $myVariable. Um aviso do PHP será gerado quando uma consulta com parâmetros por valor for executada.

    A tabela a seguir descreve os elementos dessa matriz:

    Elemento Descrição
    &$value Um valor literal ou uma referência a uma variável do PHP.
    $direction[OPCIONAL] Uma destas 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 obter mais informações sobre constantes do PHP, confira Constantes (Drivers da Microsoft para PHP para SQL Server).
    $phpType[OPCIONAL] Uma constante SQLSRV_PHPTYPE_* que especifica o tipo de dados PHP do valor retornado.
    $sqlType[OPCIONAL] Uma constante SQLSRV_SQLTYPE_* que especifica o tipo de dados do SQL Server do valor de entrada.

$options [OPTIONAL]: Uma matriz associativa que define as propriedades da consulta. A tabela a seguir lista as chaves compatíveis e os valores correspondentes:

Chave Valores com suporte Descrição
ClientBufferMaxKBSize Um inteiro positivo Configura o tamanho do buffer que contém o conjunto de resultados de um cursor do lado do cliente.

O padrão é 10240 KB. Para saber mais, veja como 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 buscados.

Qualquer inteiro negativo ou um valor maior que 4 será ignorado.

Esta opção funcionará somente quando o FormatDecimals for true.
FormatDecimals true ou false

O valor padrão é false.
Especifica quando é apropriado adicionar zeros iniciais em cadeias de caracteres decimais e habilita a opção DecimalPlaces para a formatação de tipos monetários.

Para saber mais, confira Formatação de cadeias de caracteres decimais e valores monetários (driver SQLSRV).
QueryTimeout Um inteiro positivo Define o tempo limite da consulta em segundos. Por padrão, o driver aguarda resultados indefinidamente.
ReturnDatesAsStrings true ou false

O valor padrão é false.
Configura a instrução para recuperar os tipos de data e hora como cadeia de caracteres (true). Para saber mais, leia Como recuperar um tipo de data e hora como cadeias de caracteres usando o driver SQLSRV.
Rolável SQLSRV_CURSOR_FORWARD

SQLSRV_CURSOR_STATIC

SQLSRV_CURSOR_DYNAMIC

SQLSRV_CURSOR_KEYSET

SQLSRV_CURSOR_CLIENT_BUFFERED
Para obter mais informações sobre esses valores, consulte Especificando um tipo de cursor e selecionando linhas.
SendStreamParamsAtExec true ou false

O valor padrão é true.
Configura o driver para enviar todos os dados de fluxo na execução true ou para enviar dados de fluxo em partes (false). Por padrão, o valor é definido como true. Para obter mais informações, consulte sqlsrv_send_stream_data.

Valor retornado

Um recurso de instrução. Se não for possível criar o recurso de instrução, false será retornado.

Comentários

Quando você prepara uma instrução que usa variáveis como parâmetros, as variáveis são associadas à instrução. Isso significa que, se você atualizar os valores das variáveis, da próxima vez que executar a instrução, ela será executada com valores de parâmetros atualizados.

A combinação de sqlsrv_prepare e sqlsrv_execute separa a preparação e a execução da instrução em duas chamadas de função e pode ser usada para executar consultas parametrizadas. Essa função é ideal para executar uma instrução várias vezes com valores de parâmetros diferentes para cada execução.

Para obter estratégias alternativas para gravar e ler grandes quantidades de informações, consulte Batches of SQL Statements e BULK INSERT.

Para obter mais informações, confira Como recuperar parâmetros de saída usando o driver SQLSRV.

Exemplo 1

O exemplo a seguir prepara e executa uma instrução. A instrução, quando executada (veja sqlsrv_execute), atualiza um campo na tabela Sales.SalesOrderDetail do banco de dados AdventureWorks. O exemplo supõe que o SQL Server e o banco de dados AdventureWorks estejam instalados no computador local. Toda a saída será gravada no console quando o exemplo for executado da linha de comando.

<?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 a seguir demonstra como preparar uma instrução e executá-la novamente com valores de parâmetros diferentes. O exemplo a seguir atualiza a coluna OrderQty da tabela Sales.SalesOrderDetail no banco de dados AdventureWorks. Depois que as atualizações forem concluídas, o banco de dados será consultado para verificar se as atualizações foram bem-sucedidas. O exemplo supõe que o SQL Server e o banco de dados AdventureWorks estejam instalados no computador local. Toda a saída será gravada no console quando o exemplo for executado da linha de comando.

<?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);  
?>  

Observação

É recomendável usar cadeias de caracteres como entradas ao associar valores a uma coluna decimal ou numérica a fim de garantir a precisão e a exatidão, pois o PHP tem uma precisão limitada para números de ponto flutuante. O mesmo se aplica a colunas bigint, principalmente quando os valores estão fora do intervalo de um inteiro.

Exemplo 3

Este exemplo de código mostra como associar um valor decimal como um 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);  

?>

Consulte Também

Referência da API do driver SQLSRV

Como: Executar consultas parametrizadas

Sobre exemplos de código na documentação

Como: Enviar dados como um fluxo

Usando parâmetros direcionais

Recuperando dados

Atualizar dados (Drivers da Microsoft para PHP para SQL Server)