我已阅读下面列出的一些文章,试图找到问题的答案。他们似乎都有同样的问题。
我看到this one但我在MySQL文档中读到默认情况下所有程序都是非确定性的。
This one与我的问题没有任何关系,因为它的SQL Server(不是MySQL)。
以下是我用来创建程序的查询:
CREATE PROCEDURE getcusbyzip(zipcode VARCHAR(30),radius VARCHAR(30))
SELECT C.CustomerName, C.MenuId
FROM Customers C
INNER JOIN (
SELECT ZIPCODE, ( 3959 * ACOS( COS( RADIANS( (
SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =zipcode
LIMIT 0 , 1
) ) ) * COS( RADIANS( LAT ) ) * COS( RADIANS( LNG ) - RADIANS( (
SELECT Z.LNG
FROM ZipCodes Z
WHERE Z.ZIPCODE =zipcode
LIMIT 0 , 1
) ) ) + SIN( RADIANS( (
SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =zipcode
LIMIT 0 , 1
) ) ) * SIN( RADIANS( LAT ) ) ) ) AS distance
FROM ZipCodes
HAVING distance <radius
ORDER BY distance
LIMIT 0 , 20
) AS RelevantCodes ON ( C.ZIPCODE = RelevantCodes.ZIPCODE )
现在如果我在那之后运行此查询:
CALL getcusbyzip(08360,50)
我返回零行。但是,如果我在程序中运行完全相同的语句只是一个查询,并将params放入这样:
SELECT C.CustomerName, C.MenuId
FROM Customers C
INNER JOIN (
SELECT ZIPCODE, ( 3959 * ACOS( COS( RADIANS( (
SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =08360
LIMIT 0 , 1
) ) ) * COS( RADIANS( LAT ) ) * COS( RADIANS( LNG ) - RADIANS( (
SELECT Z.LNG
FROM ZipCodes Z
WHERE Z.ZIPCODE =08360
LIMIT 0 , 1
) ) ) + SIN( RADIANS( (
SELECT Z.LAT
FROM ZipCodes Z
WHERE Z.ZIPCODE =08360
LIMIT 0 , 1
) ) ) * SIN( RADIANS( LAT ) ) ) ) AS distance
FROM ZipCodes
HAVING distance <50
ORDER BY distance
LIMIT 0 , 20
) AS RelevantCodes ON ( C.ZIPCODE = RelevantCodes.ZIPCODE )
我得到了我想要的东西。答案应该只有一行,但为什么结果不是在程序中而是在我的程序中,但当我把它放在一个时它不会给我一行。
我想也许是因为我没有BEGIN和END但是当我把它放在创建行之后而END放在最后一行之后它无法生成程序。
答案 0 :(得分:1)
您的示例代码和存储过程代码彼此差异很大。
为了确定您的问题,您需要执行以下操作
位于示例代码的顶部(不是SP)
然后,将示例代码的其余部分修改为与存储过程完全相同。
您将能够使用此方法确定确切的问题。
正如评论中所提到的,可能是由于滥用varchars被转换为数字。
<强>摘要强>
在示例代码的顶部声明并设置变量,以便示例的其余部分与存储过程完全相同。然后你就可以开始识别问题了。