2010-04-06 2 views
1

В Java-JDBC, можно легко выполнить следующий SQL (обратите внимание на двойные кавычки столбцов и имена таблиц)PHP mssql_query двойные кавычки не могут быть использованы

Select 
     cus."customer_id" , 
     cus."organisation_or_person" , 
     cus."organisation_name" , 
     cus."first_name" , 
     cus."last_name" , 
     cus."date_became_customer" , 
     cus."other_customer_details" 
From 
     "Contact_Management"."dbo"."Customers" cus 

Но один и тот же запрос в ошибках PHP , говоря, недопустимый синтаксис

"Предупреждение: mssql_query() [function.mssql-запрос]: сообщение:. Неправильный синтаксис около 'customer_id' (15) серьезность"

Но если удалить все двойные кавычки, запрос работает штраф и никаких ошибок.

Запрос переносится из приложения Java, поэтому я хотел бы сохранить двойные кавычки и SQL как есть. Любые альтернативные решения?

Спасибо Nilesh

VolkerK - Решение (SET QUOTED_IDENTIFIER ON)

Я следующее

$sql = <<<EOD 
Select 
     cus."customer_id" , 
     cus."organisation_or_person" , 
     cus."organisation_name" , 
     cus."first_name" , 
     cus."last_name" , 
     cus."date_became_customer" , 
     cus."other_customer_details" 
From 
     "Contact_Management"."dbo"."Customers" cus 
EOD; 

$db->Execute('SET QUOTED_IDENTIFIER ON'); 
    $rs = $db->Execute($sql); 

И это сработало идеально

Спасибо большое ..

ответ

0

QUOTED_IDENTIFIER, вероятно, установлен в положение OFF.

http://msdn.microsoft.com/en-us/library/ms174393.aspx говорит:

SET QUOTED_IDENTIFIER (Transact-SQL)
[...]
Когда SET QUOTED_IDENTIFIER включен, идентификаторы могут быть разграничены в двойные кавычки, а литералы должны быть разделены одиночными кавычки. Когда SET QUOTED_IDENTIFIER выключен, идентификаторы не могут быть указаны и должны следовать всем правилам Transact-SQL для идентификаторов. Для получения дополнительной информации см Identifiers
[...]
Драйвер ODBC SQL Server Native Client и SQL Server Native Client OLE DB Provider для SQL Server автоматически устанавливается QUOTED_IDENTIFIER в положение ON при подключении. Это можно настроить в источниках данных ODBC, в атрибутах соединения ODBC или в свойствах соединения OLE DB. Значение по умолчанию для SET QUOTED_IDENTIFIER отключено для соединений из приложений DB-Library.

установить его на On, и вы хорошо пойдете.

+0

Тот же запрос отлично работает с тем же экземпляром из Java, поэтому я не думаю, что с SQL-сервером что-то не так. Я думаю, что это больше проблема с библиотекой php. – Nilesh

+0

Это не серверный параметр. Таким образом, ваше приложение Java может использовать другую настройку. – VolkerK

+0

Привет, Фолькерк, ты прав, он решил мою проблему. Я прошу прощения за ответ, не протестировав его. я сделал следующий \t $ SQL = <<< EOD Выберите Кас. "Customer_id", Каса. "Organisation_or_person", Каса. "Organisation_name", Каса. "First_name", Каса.» last_name ", cus." date_became_customer ", cus." other_customer_details " От " Contact_Management "." dbo "." Клиенты "cus EOD; $ db-> Выполнить ('SET QUOTED_IDENTIFIER ON'); $ rs = $ db-> Выполнять ($ sql); И это сработало отлично Благодарю вас большое. – Nilesh

0

Это не совсем, как есть, но вы могли бы заменить двойные кавычки " с обратными кавычками:

Select 
     cus.`customer_id` , 
     cus.`organisation_or_person` , 
     cus.`organisation_name` , 
     cus.`first_name` , 
     cus.`last_name` , 
     cus.`date_became_customer` , 
     cus.`other_customer_details` 
From 
     `Contact_Management`.`dbo`.`Customers` cus 
+0

Дав, backticks тоже не работают. Он дает следующую ошибку: Предупреждение: mssql_query() [function.mssql-query]: message: Неверный синтаксис рядом с ''. – Nilesh

0

Что об этом?

$query ='Select 
    cus."customer_id" , 
    cus."organisation_or_person" , 
    cus."organisation_name" , 
    cus."first_name" , 
    cus."last_name" , 
    cus."date_became_customer" , 
    cus."other_customer_details" 
From 
    "Contact_Management"."dbo"."Customers" cus'; 

$query = str_replace('"', '', $query); 
+0

Я мог бы использовать это, но что, если есть имя столбца с пробелом между словами, это будет разбито тогда Например, выберите cus. «Идентификатор клиента» ... где есть пробел между клиентом и ID – Nilesh