2

この機能:

CREATE FUNCTION `GetCardID`(numId INT) RETURNS int(11)
    DETERMINISTIC
BEGIN
    DECLARE retcard INT(11);
    SELECT id
    INTO retcard
    FROM cards
    WHERE `number` = numId
        AND enabled = 1
    LIMIT 1;
    RETURN retcard;
END

クエリが次の場合でも、常に null を返します。

SELECT id FROM cards WHERE `number`=<Insert Value Here> AND ENABLED = 1 LIMIT 1;

関数パラメータで使用されているのと同じ値に対して有効な値を返します。

例:
SELECT id FROM cards WHERE number=12345 AND ENABLED = 1 LIMIT 1;
-- ID を返しますが、
GetCardId(12345);
-- null を返します

私がここで見逃しているアイデアはありますか?私は自分自身が SQL にはかなり熟練していると考えていますが、SP については少しグリーンです。

4

3 に答える 3

1

関数に取り込んでいるデータのサイズはどれくらいですか? その数が INT に収まる数よりも大きい可能性はありますか?

于 2013-02-26T20:56:20.007 に答える
1

ここのクリストファーはあなたの役割です。これを試してみてください。うまくいくはずです:

CREATE FUNCTION [dbo].[GetCardID]
(  
    @Num_ID INT

)  
RETURNS int  
AS  
BEGIN  
    declare @retcard int    

    select Top 1 @retcard = id 
    FROM cards 
    where number = @num_Id
    AND enabled = 1

    return @retcard



END
于 2013-02-15T22:39:22.190 に答える
0

Always returns NULL

プロシージャ定義のDETERMINISTIC句を削除します。MySQLは、そのようなプロシージャまたは関数からの応答をキャッシュします。

MySQLからの抜粋:

ルーチンは、同じ入力パラメーターに対して常に同じ結果を生成する場合は「決定論的」と見なされ、それ以外の場合は「決定論的ではない」と見なされます。ルーチン定義でDETERMINISTICもNOTDETERMINISTICも指定されていない場合、デフォルトはNOTDETERMINISTICです。関数が決定論的であることを宣言するには、DETERMINISTICを明示的に指定する必要があります

MySQL5.5-プロシージャまたは関数の作成

于 2013-02-15T17:50:47.823 に答える