发生了SQL语法错误

时间:2017-11-22 15:47:40

标签: mysql sql-server perl delimiter

这是我的简单查询:

          my $SQLp = "SELECT MAX([PawnPayments].[CreationTimeDate]) as MaxTransDate
                FROM [PawnSafeDBCE].[dbo].[PawnPayments]
                INNER JOIN [PawnSafeDBCE].[dbo].[PawnPaymentDetails]
                ON [PawnPayments[.[PaymentID] = [PawnPaymentDetails].[PaymentID]
                WHERE [PawnPaymentDetails].[TicketID[ = '$TicketID'
                AND [PawnPaymentDetails].[StoreID] ='$StoreID'

请注意,查询是在Perl引擎上编写的。我一直收到错误消息:

“您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以便在[PawnPayments]附近使用正确的语法。[CreationTimeDate])为MaxTransDate:”

我认为该错误与括号表示法有关,但不幸的是,由于构造不良的第三方表格,我不得不使用此样式。有帮助吗?我错过了一些明显的东西吗?

巨大的编辑:我查询的表实际上是在SQL服务器上,而不是MySQL服务器上!我的数据库在MySQL服务器上运行,但是这个第三方数据库在旧版本的Microsoft SQL上运行。

2 个答案:

答案 0 :(得分:2)

我不知道为什么你的表名和列名都有这些方括号,但它们不是必需的,它们不是标准的SQL。这就是导致语法错误的原因。

https://www.goole.com/moner.mp3

我还要补充说,在你的SQL语句中插入变量可能会让你对SQL injection attacks开放。最好在SQL中使用绑定点,并使用my $SQLp = "SELECT MAX(PawnPayments.CreationTimeDate) as MaxTransDate FROM PawnSafeDBCE.dbo.PawnPayments INNER JOIN PawnSafeDBCE.dbo.PawnPaymentDetails ON PawnPayments.PaymentID = PawnPaymentDetails.PaymentID WHERE PawnPaymentDetails.TicketID = '$TicketID' AND PawnPaymentDetails.StoreID ='$StoreID'"; 的额外参数来填充值(假设您使用的是DBI)。

execute

更新:由于Bill Karwin在评论中指出,my $SQLp = "SELECT MAX(PawnPayments.CreationTimeDate) as MaxTransDate FROM PawnSafeDBCE.dbo.PawnPayments INNER JOIN PawnSafeDBCE.dbo.PawnPaymentDetails ON PawnPayments.PaymentID = PawnPaymentDetails.PaymentID WHERE PawnPaymentDetails.TicketID = ? AND PawnPaymentDetails.StoreID = ?"; my $sth = $dbh->prepare($SQLp); $sth->execute($TicketID, $StoreID); 语法在MySQL数据库中没有任何意义。所以我觉得你有点困惑。你得到的错误信息肯定提到MySQL,所以你使用DBD :: MySQL连接到MySQL服务器 - 但也许你应该连接到MSSQL服务器。

如果向我们展示了您的数据库连接代码 - 设置database.schema.table(或等效)变量的调用,则可能会有用。

答案 1 :(得分:1)

您说您正在查询MS SQL数据库,但错误消息明确表示您正在使用MySQL数据库或MySQL数据库驱动程序。

如果要查询MS SQL数据库,请修复连接字符串。

如果您要查询MySQL数据库,请使用与MySQL兼容的查询。 MySQL使用反引号来引用标识符(不是像MS SQL那样的方括号)。

[PawnPayments].[CreationTimeDate]

应该是

`PawnPayments`.`CreationTimeDate`

请注意,由于插入SQL查询中的值引用不正确,您的代码会受到注入错误的影响。 (仅仅在值周围加上引号是不够好的!)这些可能导致代码失败,并且它们可能使您容易受到注入攻击。修复引用,或使用可替换参数。