Результаты не возвращаются при добавлении искушаемого и запросе его в SQLSRV - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь создать шаблон и выполнить некоторые вычисления, которые заполняют шаблон и, наконец, получить результаты из созданной таблицы временных параметров.Но до сих пор у меня не получилось.Мой запрос немного сложнее, но вот что я пытаюсь сделать.В этом коде предполагается, что у нас установлено соединение с базой данных с помощью codeigniter.

-- This generate no results i.e. Array ()
$sql = "CREATE TABLE #output(name varchar NULL, id int NULL);
            insert into #output (name,id) VALUES('sam',5) 
            SELECT * FROM #output";
$res = $this->db->query($sql);

--Also tried this and returns nothing
$queryList = [
    'sql1' => "IF OBJECT_ID('tempdb.dbo.#output', 'U') IS NOT NULL DROP TABLE #output;",
    'sql2' => "CREATE TABLE #output(name varchar NULL, id int NULL);",
    'sql3' => "insert into #output (name,id) VALUES('sam',5)",
    'sql4' => "SELECT * FROM #output"
        ];
$result = array();
        foreach($queryList as $key => $value){
            $result[$key] = $this->db->query($value, FALSE, TRUE); 
        }

Эти два кода были написаны с использованием драйверов codeigniter db.Ни одна из перечисленных выше проблем даже не привела к тому, что #output temptable в базе данных tempdb.

Я также пытался использовать sqlsrv_query напрямую, по крайней мере, он создал #output temptable, но не дал мне никаких результатов.

-- Created the #output temptable but didn't give me back the data inserted
$conn = sqlsrv_connect( $serverName, $connectionInfo);
            if( $conn ) {
                 echo "Connection established.<br />";
                 $sql = "CREATE TABLE #output(name varchar NULL, id int NULL);
            insert into #output (name,id) VALUES('sam',5) 
            SELECT * FROM #output
            --DROP TABLE #output";
            $stm = sqlsrv_query($conn, $sql,[]);
            while( $obj = sqlsrv_fetch_object( $stm )) {
                echo $obj->name . '<br />';
                //print_r($obj);
          }

Я пробовал много сценариев, но не мог понять, что не так с моим кодом.О, кстати, я также попробовал codeigniter trans_start() и закончил и добавил каждый запрос как отдельный запрос, но это тоже не сработало.Я не мог думать или искать что-то еще, и вот мой запрос о помощи.

Вот мое окружение:

  • SQLSRV 5.3

  • SQL-сервер 2012

  • Драйвер ODBC 17

  • CodeIgniter 3.1.9

  • PHP 7.0.31

1 Ответ

0 голосов
/ 19 сентября 2018

Решение:

Необходимо устранить некоторые проблемы:

  • определить varchar столбцы в следующем формате: varchar [(n|max)].Если n не указано, длина по умолчанию равна 1, и при попытке вставить значение 'sam' будет сгенерировано предупреждение.
  • поместите SET NOCOUNT ON; в качестве первого оператора.Если вы пропустите эту часть, ваш оператор вернет более одного набора результатов, поэтому вы должны сделать его доступным, используя sqlsrv_next_result().

Рабочий пример:

<?php
$server   = 'server\instance,port';
$database = 'database';
$username = 'username';
$password = 'password';
$cinfo = array(
    "Database" => $database,
    "UID" => $username,
    "PWD" => $password
);
$conn = sqlsrv_connect($server, $cinfo);
if ($conn === false) {
    echo print_r(sqlsrv_errors(), true);
    exit;
}

# Statement
$sql = "
    SET NOCOUNT ON;
    CREATE TABLE #output(name varchar(50) NULL, id int NULL);
    INSERT INTO #output (name, id) VALUES ('sam', 5);
    SELECT * FROM #output;
";
$stmt = sqlsrv_query($conn, $sql);
if ($stmt === false) {
    echo print_r(sqlsrv_errors(), true);
    exit;
}

# Results
while ($obj = sqlsrv_fetch_object($stmt)) {
   echo 'Name: '.$obj->name.'</br>';
   echo 'ID: '.$obj->id.'</br>';
}

# End
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

Примечания:

Я не очень знаком с CodeIgniter, но думаю, что это ваша проблема.

...