这是我的简单查询:
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上运行。
答案 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查询中的值引用不正确,您的代码会受到注入错误的影响。 (仅仅在值周围加上引号是不够好的!)这些可能导致代码失败,并且它们可能使您容易受到注入攻击。修复引用,或使用可替换参数。