在另一个存储过程中获取存储过程的参数。

时间:2011-08-29 13:54:21

标签: sql vb.net

这可能更像是一个“最佳实践”问题,而不是真正的代码问题。

我有一个更新表的存储过程,但需要来自另一个表的几个值。

前两个选择从表中获取值,然后在update语句中使用。

选择陈述:

 Select @iStatusDropDownValueID = iDropDownValueID
        From DropDownValue
        Inner Join DropDownValueType On DropDownValue.iDropDownValueTypeID = DropDownValueType.iDropDownValueTypeID
        Where DropDownValueType.vchDropDownValueTypeName = 'Status'
        AND DropDownValue.vchDropDownValueName = 'Scheduled'
        AND DropDownValue.tiRecordStatus = 1
        And DropDownValueType.tiRecordStatus = 1

 Select @iLastStatusDropDownValueID = iDropDownValueID
        From DropDownValue
        Inner Join DropDownValueType On DropDownValue.iDropDownValueTypeID = DropDownValueType.iDropDownValueTypeID
        Where DropDownValueType.vchDropDownValueTypeName = 'Status'
        AND DropDownValue.vchDropDownValueName = 'CriticalErrorOccurred'
        AND DropDownValue.tiRecordStatus = 1
        And DropDownValueType.tiRecordStatus = 1

更新声明:

Update Schedule
    Set
        iStatusDropDownValueID = @iStatusDropDownValueID,
        iLastStatusDropDownValueID = @iLastStatusDropDownValueID,
        iCurrentLogID = @iCurrentLogID,
        dtNextDate = @dtNextDate,
        dtLastDate = @dtLastDate,
        iRetryCount = @iRetryCount,
        iFailedCount = @iFailedCount,
        iBusyRetryCount = @iBusyRetryCount,
        vchUpdateBy = @vchUpdateBy,
        dtUpdateDate = @dtLastDate
    WHERE
        iScheduleID = @iScheduleID

首先,前两个select语句检索的值始终相同。所以它们可以通过代码本身传递。我不知道这会加快速度,只需使整个存储过程更好,更容易阅读。

其次,如果“值名称”应该更改,则此存储过程将中断(这是可能的,但不常见)。

我正在寻找有关这种情况的最佳实践的任何见解。

2 个答案:

答案 0 :(得分:1)

我个人总是声明我的变量而不使用@vars @vars就像变种一样,它们不能保护你免受错别字的侵害 如果您使用显式声明的变量,MySQL将警告您不要打字错误,您的vars将被输入,使您的意图更清晰,您的代码稍快一些。

CREATE PROCEDURE (IN a INTEGER) 
BEGIN
  DECLARE var1 INTEGER;
  DECLARE var2 INTEGER;
  DECLARE initialized_var INTEGER DEFAULT 0;

  SET var = 1;  //to just set a var.
  SELECT myfield INTO var2 FROM atable WHERE a <> atable.b ORDER BY b LIMIT 1;
  //Always use `limit 1` here.
  //use `select into ...order by .. limit 1` to make you queries repeatable.
  //The limit 1 also speeds up things a bit.
  //make sure to test SELECT INTO vars against `null`  
  IF var2 IS NULL THEN .....

如果需要使用一个存储过程的结果,为什么不创建存储函数。

CREATE FUNCTION pi RETURNS float
BEGIN
   RETURN 3.14;
END $$

然后你可以写一个像这样的查询:

INSERT INTO atable (math_constants) VALUES (pi());

答案 1 :(得分:0)

也许我在这里遗漏了一些东西,但是如果要检索的值真的是不变的,为什么要在中检索它们呢?你可以简单地对它们进行硬编码。

在这种情况下,我倾向于这样做,因为它不仅消除了检索查询的开销,而且消除了潜在的失败点(您在问题中提到的“值名称”更改)。