错误的 table sqlserver 语法格式
Wrong table formatting for sqlserver grammar
我正在使用 Laravel 查询生成器从 sqlsrv 数据库中获取一些数据。我要找的 table 是 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 查询的重要 rule/mechanic 吗?
以下代码确实有效。这让我觉得特别奇怪:
$connection->select('select [Time Slot] as [id] from [Reukema Blocq Maneschijn BV$Time Slot (Weighbridge)]');
所以我认为SqlServerGrammar@compileFrom
方法有问题。为什么Laravel编译成这样?
就个人而言,我强烈建议更改对象的名称;这是一个糟糕的选择。如果你做不到这一点,或许可以创建一个远多于 "usable" 的同义词。例如:
CREATE SYNONYM dbo.WeighbridgeSlot FOR dbo.[Reukema Blocq Maneschijn BV$Time Slot (Weighbridge)];
然后在您的应用程序代码中改为调用同义词:
$query = $connection->query()
->from('WeighbridgeSlot')
->toSql()
在用 xDebug 做了一些测试之后。我发现了问题。这是Illuminate\Database\Query\Grammars\SqlServerGrammer@wrapTableValuedFunction
方法。
Laravel 错误地将我的 table 名称视为 table 值函数。这就是查询编译无法正常工作的原因。
我现在使用的修复程序有点脏:
$query = $connection->query()
->from('Reukema Blocq Maneschijn BV$Time Slot (Weighbridge) as time_slots')
->toSql()
通过在我的 from
方法末尾添加一个别名,table 名称将以另一种方式编译。这会阻止 table 值函数编译。
我不确定是否应该将此报告为错误。或者,如果我必须使用的 table 名称无效。
编辑:我报告了错误并创建了修复程序。您可以找到问题(和 PR)here
我正在使用 Laravel 查询生成器从 sqlsrv 数据库中获取一些数据。我要找的 table 是 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 查询的重要 rule/mechanic 吗?
以下代码确实有效。这让我觉得特别奇怪:
$connection->select('select [Time Slot] as [id] from [Reukema Blocq Maneschijn BV$Time Slot (Weighbridge)]');
所以我认为SqlServerGrammar@compileFrom
方法有问题。为什么Laravel编译成这样?
就个人而言,我强烈建议更改对象的名称;这是一个糟糕的选择。如果你做不到这一点,或许可以创建一个远多于 "usable" 的同义词。例如:
CREATE SYNONYM dbo.WeighbridgeSlot FOR dbo.[Reukema Blocq Maneschijn BV$Time Slot (Weighbridge)];
然后在您的应用程序代码中改为调用同义词:
$query = $connection->query()
->from('WeighbridgeSlot')
->toSql()
在用 xDebug 做了一些测试之后。我发现了问题。这是Illuminate\Database\Query\Grammars\SqlServerGrammer@wrapTableValuedFunction
方法。
Laravel 错误地将我的 table 名称视为 table 值函数。这就是查询编译无法正常工作的原因。
我现在使用的修复程序有点脏:
$query = $connection->query()
->from('Reukema Blocq Maneschijn BV$Time Slot (Weighbridge) as time_slots')
->toSql()
通过在我的 from
方法末尾添加一个别名,table 名称将以另一种方式编译。这会阻止 table 值函数编译。
我不确定是否应该将此报告为错误。或者,如果我必须使用的 table 名称无效。
编辑:我报告了错误并创建了修复程序。您可以找到问题(和 PR)here