首页 > 解决方案 > sqlserver语法错误的表格式

问题描述

我正在使用 Laravel 查询生成器从 sqlsrv 数据库中获取一些数据。我要找的桌子是dbo.[Reukema Blocq Maneschijn BV$Time Slot (Weighbridge)]. 不是我的选择。该数据库由另一家公司开发。

General error: 20018 Invalid object name执行查询时,我不断收到错误消息。我仔细检查了名称是否有错别字,但我找不到。

我确实发现编译查询时出现问题。这是我测试问题的代码:

$query = $connection->query()
    ->from('Reukema Blocq Maneschijn BV$Time Slot (Weighbridge)')
    ->toSql()

当我转储 时$query,我得到以下信息:

string(67) "select * from [Reukema Blocq Maneschijn BV$Time Slot ](Weighbridge)"

这里]是错误的地方。

这个问题一直存在,即使我使用了raw()帮助器:

$query = $connection->query()
    ->from($connection->raw('dbo.[Reukema Blocq Maneschijn BV$Time Slot (Weighbridge)]'))
    ->toSql()

即使在最后一个示例中,]从字符串末尾移动到(.

为什么是这样?我是否缺少编译 sqlsrv 查询的重要规则/机制?

以下代码确实有效。这让我觉得特别奇怪:

$connection->select('select [Time Slot] as [id] from [Reukema Blocq Maneschijn BV$Time Slot (Weighbridge)]');

所以我认为SqlServerGrammar@compileFrom方法有问题。Laravel 为什么要这样编译?

标签: phpsql-serverlaravelsqlsrv

解决方案


就个人而言,我强烈建议更改对象的名称;这是一个糟糕的选择。如果你不能这样做,也许创建一个更“可用”的同义词。例如:

CREATE SYNONYM dbo.WeighbridgeSlot FOR dbo.[Reukema Blocq Maneschijn BV$Time Slot (Weighbridge)];

然后在您的应用程序代码中调用同义词:

$query = $connection->query()
    ->from('WeighbridgeSlot')
    ->toSql()

推荐阅读