1

以下にリストされている記事をいくつか読んで、問題の解決策を見つけようとしました。どちらも同じ問題を抱えているようでした。

私はこれを見ましたが、MySQL のドキュメントで、すべてのプロシージャはデフォルトで非決定論的であると読みました。

これは、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 )

私はまさに私が欲しかったものを手に入れました。答えは1行だけである必要がありますが、プロシージャではないのに結果が返されるのはなぜですか。

BEGIN と END がなかったのではないかと思いましたが、作成行の後に配置し、最後の行の後に END を配置すると、プロシージャの生成に失敗します。

4

1 に答える 1

1

サンプル コードとストアド プロシージャ コードがあまりにも異なっています。

問題を特定するには、次のことを行う必要があります。

サンプル コードの先頭 (SP ではない)

  • varchar(30) 型の zipcode という変数を宣言します。
  • varchar(30) 型の radius という変数を宣言します。

次に、サンプル コードの残りの部分を、ストアド プロシージャとまったく同じになるように変更します。

この方法を使用すると、問題を正確に特定できます。

コメントで述べたように、数値に変換される varchars の乱用が原因である可能性があります。

概要

サンプル コードの先頭で変数を宣言して設定し、サンプルの残りの部分がストアド プロシージャとまったく同じになるようにします。その後、問題の特定を開始できます。

于 2013-02-10T03:57:39.750 に答える