2010-04-06 101 views
1

在Java的JDBC,我可以很容易地运行下面的SQL(注意周围的列和表名称双引号)在PHP错误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 

但相同的查询说出来无效的语法

“警告: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为ON,标识符可以用双引号分隔,而文字必须由单一的分隔引号。 当SET QUOTED_IDENTIFIER为OFF时,不能引用标识符,并且必须遵循标识符的所有Transact-SQL规则。欲了解更多信息,请参阅 Identifiers
[...]
SQL Server的SQL Server的本机客户端ODBC驱动程序和SQL Server本机客户端OLE DB提供程序在连接时自动设置QUOTED_IDENTIFIER为ON。这可以在ODBC数据源中,ODBC连接属性或OLE DB连接属性中进行配置。 对于来自DB-Library应用程序的连接,SET QUOTED_IDENTIFIER的默认值为OFF。

将它设置为On,你很好走。

+0

对于来自Java的同一实例,相同的查询工作正常,所以我不认为它是SQL Server的错误。我认为这是更多的PHP库问题。 – Nilesh 2010-04-06 22:34:43

+0

这不是服务器范围内的设置。所以你的Java应用程序可能会使用其他设置 – VolkerK 2010-04-06 22:37:36

+0

嗨Volkerk,你是对的,它解决了我的问题。我对未经测试而回复表示歉意。 我做了以下 \t $ SQL = <<< EOD 选择 CUS。 “CUSTOMER_ID”, CUS。 “organisation_or_person”, CUS。 “ORGANISATION_NAME”, CUS。 “FIRST_NAME”, CUS“。 last_name“, cus。”date_became_customer“, cus。”other_customer_details“ 从 ”Contact_Management“。”dbo“。”Customers“cus EOD; $ db-> Execute('SET QUOTED_IDENTIFIER ON'); $ rs = $ db-> Execute($ sql); 它工作完美 非常感谢你非常感谢 – Nilesh 2010-04-06 22:42:35

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

Dav,反引用也不起作用。它给出了以下错误 警告:mssql_query()[function.mssql-query]:message:'''附近的语法不正确。 – Nilesh 2010-04-06 22:32:18

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

我可以使用这个,但是如果在单词之间有一个空白字段的列名,那么这将会被破坏,然后 例如,选择客户“客户ID”...客户与客户之间存在空间ID – Nilesh 2010-04-06 22:33:47