Как использовать имя базы данных с пробелом и специальным символом в sql - PullRequest
0 голосов
/ 10 июля 2019

Я создаю приложение, используя CodeIgniter.в настоящее время пытаюсь найти способ извлечения данных из второй базы данных, которая содержит таблицы с именами, содержащими специальные символы и пробелы.

Я пытаюсь получить данные в моей модели следующим образом:

 public function getCommandeData($username= null)
{
    $this->legacy_db = $this->load->database('OtherDB', true);
    $bdd ='[SS$DP - Order]';
    if($username) {
        $sql = "SELECT top 5 FROM" + $bdd+"  WHERE id = ?";
        $query = $this->legacy_db->query($sql, array($username));
        return $query->result_array();
    }

    $sql = 'SELECT top 5 FROM [SS$DP - Order]';
    $query = $this->legacy_db->query($sql);
    return $query->result_array();
}

но я получаю эту ошибку:

[Microsoft] [Драйвер ODBC 13 для SQL Server] [SQL Server] Синтаксис неверен в сравнении с «FROM».ВЫБЕРИТЕ верхние 5 ОТ [SS $ DP - Порядок]

Здесь, где я определил альтернативное подключение к этой базе данных:

$db['OtherDB'] = array(
'dsn'   => '',
'hostname' => '192.168.14.100',
 'port' => '1433',
'username' => 'StockAgent',
'password' => 'StockAgent',
'database' => 'SVC',
'dbdriver' => 'sqlsrv',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => (ENVIRONMENT !== 'production'),
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8',
'dbcollat' => 'utf8_general_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE

);

Может кто угодноподскажите в чем проблема и как ее исправить?

EDIT2

После добавления пробела между From и $ bdd

Уровень важности: предупреждение

Сообщение: обнаружено нечисловое значение

, указывающее эту строку:

 $sql = "SELECT * FROM " + $bdd;

EDIT 2

Я понял, что $ bdd это строка, поэтому лучше использовать сцепление .=$bdd вместо +$bdd

моя функция стала такой:

   public function getCommandeData($username= null)
{
    $this->legacy_db = $this->load->database('OtherDB', true);
    $bdd ='[SS$DP - Order]';

    /*($username) {
        $sql = "SELECT top 5 FROM " +$bdd;/* " WHERE id = ?"
        $query = $this->legacy_db->query($sql, array($username));
        return $query->result_array();
    }*/

    $sql = "SELECT top 2 FROM " ;
    $sql.=" ";
    $sql.=$bdd;
    $query = $this->legacy_db->query($sql);
    return $query->result_array();

}

, когда я пытаюсь получить всю дату, используя select * Я получаю эту ошибку:

Превышен предел памяти в 10240 КБдля буферизованного запроса SELECT * FROM [SS $ DP - Order]

Но когда я ограничиваю размер с помощью top 50, я получаю это

[Microsoft] [Драйвер ODBC 13 для SQL Server] [SСервер QL] Синтаксис неверен по сравнению с «FROM».ВЫБЕРИТЕ топ 50 ОТ [SS $ DP - Заказ]

Ответы [ 2 ]

0 голосов
/ 10 июля 2019

Я могу решить эту проблему следующим образом:

   public function getCommandeData($username= null)
{
    $this->legacy_db = $this->load->database('OtherDB', true);
    $DP ="\$DP";
    $bdd ="[Sovac\$DP - Order]";

    if($username) {
        $sql = "SELECT top 5 FROM ".$bdd ." WHERE id = ?";
        $query = $this->legacy_db->query($sql, array($username));
        return $query->result_array();
    }
 }

Я вынужден использовать конкатенацию вместо добавления.

0 голосов
/ 10 июля 2019

У вас нет пробела между FROM и именем таблицы.

$sql = "SELECT top 5 FROM" + $bdd+"  WHERE id = ?";

должно быть

$sql = "SELECT top 5 FROM " + $bdd+"  WHERE id = ?";
...