我在 PHP 中为 SQL Server 数据库编写的查询遇到了一个问题,即单词未被识别为表名。我使用的是 SQL Server for PHP 2.0 (VC6)。以下查询有效,并在 SQL Server Management Studio 中执行时Order
返回表中的所有订单。
SELECT * FROM "db_name"."dbo"."Order" (also tried using brakets [] around table name)
在PHP中,我收到以下错误:
[0] => Array
(
[0] => IMSSP
[SQLSTATE] => IMSSP
[1] => -35
[code] => -35
[2] => Invalid type
[message] => Invalid type
)
此查询适用于数据库中所有其他表的 PHP 代码,db_name
.. 它不适用于表 Order
,这是正确的表名。我尝试了双引号、矩形括号、无引号/括号等,但无济于事。有人知道如何解决这个问题吗?
** 更新:
我找到了解决这个问题的方法。请查看修复或解决方法的答案之一。
PHP 或你的驱动程序中一定发生了什么。 您应该能够使用 SQL Server 事件探查器查看正在提交的实际查询。
无论如何,如果你找不到它在做什么。 您可以将其视为解决方法:
CREATE VIEW dbo.MyOrder
AS
SELECT * FROM [Order]
继续前进 - 生命太短暂了。
好吧,我找到了解决问题的方法。这是我的规格:
- 视窗 7 64 位
- PHP 5.3 VC9 编译(在尝试解决此问题时从 VC^ 版本更新了它)
- 驱动程序: SQL for PHP 2.0 (VC9)
- 我尝试从中提取数据的表名:
[Order]
- 我正在使用的查询:
SELECT * FROM [db_name].[dbo].[Order] WHERE ...
上面的查询根本不适用于 PHP 的 Order
表,而在 SSMS 中运行良好。db_name
的所有其他桌子也都查询得很好。我尝试创建视图或使用别名,但它们都不适合Order
.
我从一开始就应该想到,但我最终尝试只查询一列,例如[OrderID]
,你知道什么?只要您在查询中逐个列出列名,它就会起作用。我相信 MSSQL 中的一列在 MySQL 中不受支持。所以
SELECT [OrderID],[OrderNumber],... FROM [db_name].[dbo].[Order] WHERE ...
工作得很好!我希望这将在未来为某人节省一些痛苦。
当查询返回 PDO 无法处理的列类型时,会发生此错误。例如,当您尝试
SELECT default_value FROM sys.parameters
因为该列是类型 sql_variant。如果有意义,宁愿将该列转换为 varchar 或其他列,或者从查询中删除它。
在您的案例中发生的情况可能是,该表上有一列类型奇怪,当您显式命名所需的列时,该列被消除。
一个表不能被命名为"order":这是SQL中的保留字
在很多情况下,您可能会在引号(或反引号)之间使用此名称,但您总是会在无法处理它的情况下结束。重命名此表。
如果您不能尝试为它添加别名:
SELECT * FROM "db_name"."dbo"."Order" as ord