Sql 存储过程中的逻辑

Sql 存储过程中的逻辑,sql,stored-procedures,sql-server-2000,Sql,Stored Procedures,Sql Server 2000,我需要存储过程中的一些逻辑。所有存储过程都执行一对逻辑规则,然后根据结果返回true或false 伪SQL代码: CREATE TABLE #PV ([Date] DATETIME, Dis FLOAT, Del Float, Sold Float) INSERT #PV exec GetPVSummaryReport @ID, @PID, @From, @To SELECT AVG(Dis) / 8 AS DisAvg, AVG(Del) AS DelAvg FROM #PV IF DisAv

我需要存储过程中的一些逻辑。所有存储过程都执行一对逻辑规则,然后根据结果返回true或false

伪SQL代码:

CREATE TABLE #PV ([Date] DATETIME, Dis FLOAT, Del Float, Sold Float)
INSERT #PV exec GetPVSummaryReport @ID, @PID, @From, @To
SELECT AVG(Dis) / 8 AS DisAvg, AVG(Del) AS DelAvg FROM #PV
IF DisAvg > 20 -- this is the bit I am having problems grokking
    RETURN TRUE
ELSE
    -- do longer calculation
你怎么做这种逻辑


关于代码的注释:表PV有4个字段-提供的日期、Dis、Del和销售。

您需要声明一个变量并在其中进行选择

declare @DisAvg float
declare @DelAvg float

-- Instantiate #PV etc

select
  @DisAvg = avg(Dis) / 8,
  @DelAvg = avg(Del)
from
  #PV

if @DisAvg > 20
  return
else
  -- Do something else
DECLARE @DisAvg DOUBLE, @DelAvg DOUBLE
SELECT @DisAvg = AVG(Dis) / 8, @DelAvg = AVG(Del) #PV
IF @DisAvg > 20 -- this is the bit I am having problems grokking
    RETURN 1
ELSE
    -- do longer calculation
使用Dis字段的正确类型进行声明


编辑-更正返回值。

您需要声明一个变量并选择它

DECLARE @DisAvg DOUBLE, @DelAvg DOUBLE
SELECT @DisAvg = AVG(Dis) / 8, @DelAvg = AVG(Del) #PV
IF @DisAvg > 20 -- this is the bit I am having problems grokking
    RETURN 1
ELSE
    -- do longer calculation
DECLARE @DisAvg DECIMAL
DECLARE @ReturnValue bit
使用Dis字段的正确类型进行声明

编辑-已更正返回值

DECLARE @DisAvg DECIMAL
DECLARE @ReturnValue bit
//使用SET或SELECT为@DisAvg赋值

IF (@DisAvg > 20)
BEGIN 
    SET  @ReturnValue = 1
END
ELSE
BEGIN

    -- do longer calculation
SET @ReturnValue = 0
END 
SELECT @ReturnValue
RETURN语句只能返回整数,您可以改用SELECT

//使用SET或SELECT为@DisAvg赋值

IF (@DisAvg > 20)
BEGIN 
    SET  @ReturnValue = 1
END
ELSE
BEGIN

    -- do longer calculation
SET @ReturnValue = 0
END 
SELECT @ReturnValue

RETURN语句只能返回整数,您可以改用SELECT,为什么每个人都要创建临时表?变量表非常好:

让我们看看

DECLARE @PV TABLE ([Date] DATETIME,
    Dis FLOAT,
    Del FLOAT,
    Sold FLOAT)

INSERT INTO @PV
EXEC [dbo].[GetPVSummaryReport] @ID, @PID, @From, @To


-- Create some variables, which will contain the results.
DECLARE @DisAvg AS FLOAT,
    @DelAvg AS FLOAT

-- Retrieve results into a variables.
SELECT @DisAvg = AVG(Dis) / 8, @DelAvg AVG(Del)
FROM @PV

-- Check results...    
IF @DisAvg > 20 
   RETURN TRUE
ELSE BEGIN
    -- do longer calculation
END

-- NOTE: I'm not sure where you use @DelAvg .. 
--       I'm assuming it's in the 'do longer calculation' section.

祝你好运

为什么每个人都要创建临时表?变量表非常好:

让我们看看

DECLARE @PV TABLE ([Date] DATETIME,
    Dis FLOAT,
    Del FLOAT,
    Sold FLOAT)

INSERT INTO @PV
EXEC [dbo].[GetPVSummaryReport] @ID, @PID, @From, @To


-- Create some variables, which will contain the results.
DECLARE @DisAvg AS FLOAT,
    @DelAvg AS FLOAT

-- Retrieve results into a variables.
SELECT @DisAvg = AVG(Dis) / 8, @DelAvg AVG(Del)
FROM @PV

-- Check results...    
IF @DisAvg > 20 
   RETURN TRUE
ELSE BEGIN
    -- do longer calculation
END

-- NOTE: I'm not sure where you use @DelAvg .. 
--       I'm assuming it's in the 'do longer calculation' section.
祝你好运

标签是一种美丽的东西。标签允许您使用GOTO,这允许您在存储过程中编写简单的逻辑


DECLARE @Result int
SET @Result = 1 -- 1=True 0=False

IF TEST1 Failed
BEGIN
  SET @Result = 0
  GOTO ENDPROCESSING
END

IF TEST2 Failed
BEGIN
  SET @Result = 0
  GOTO ENDPROCESSING
END
IF TEST3 Failed
BEGIN
  SET @Result = 0
  GOTO ENDPROCESSING
END

ENDPROCESSING:
SELECT @Result
标签是一种美丽的东西。标签允许您使用GOTO,这允许您在存储过程中编写简单的逻辑


DECLARE @Result int
SET @Result = 1 -- 1=True 0=False

IF TEST1 Failed
BEGIN
  SET @Result = 0
  GOTO ENDPROCESSING
END

IF TEST2 Failed
BEGIN
  SET @Result = 0
  GOTO ENDPROCESSING
END
IF TEST3 Failed
BEGIN
  SET @Result = 0
  GOTO ENDPROCESSING
END

ENDPROCESSING:
SELECT @Result


它必须是存储过程吗?这似乎在应用程序代码中更容易、更有用。因为我需要点击数据库两次才能找到布尔值,所以最好使用SP,这样我就不会执行过多的网络聊天。而且它将被快速连续调用大约20次。它必须是一个存储过程吗?这似乎在应用程序代码中更容易、更有用。因为我需要点击数据库两次才能找到布尔值,所以最好使用SP,这样我就不会执行过多的网络聊天。它也将被快速连续调用20次。return只能返回integersDude。失败返回可以返回浮点数、位等。。。仅Sif整数。啧啧!是的,你说得对。我更正了代码示例。我只是复制了伪代码,但没有找到。return只能返回integersDude。失败返回可以返回浮点数、位等。。。仅Sif整数。啧啧!是的,你说得对。我更正了代码示例。我刚刚复制了伪代码,但没有复制到。您没有用平均值填充@DisAvg-您没有用平均值填充@DisAvg-您没有用平均值填充@DisAvg-您正在从pv中填充最后一个Dis-RETURN语句应该有一个值来指示过程终止时所处的条件。问题是应用于表达式,而不是返回值。我故意不归还任何特别的东西,这很公平+1对于最简单的解决方案,这似乎基本上就是graham所寻找的。因为Luke是第一个,他的代码确实证明了我的错误所在,所以他得到了一个记号。返回语句应该有一个值来指示过程在终止时所处的条件。问题适用于表达式,而不是返回值。我故意不归还任何特别的东西,这很公平+1.最简单的解决方案,这似乎就是格雷厄姆想要的。因为卢克是第一个,他的代码确实证明了我哪里出了问题,他得到了答案。你真的读过你链接的文章了吗?在某些情况下,表变量的性能比临时表差得多。根据这一点,如果插入@table EXEC sp_someProcedure,则不能使用表变量,这正是我正在做的。@DelAvg应该位于逻辑的OR部分。我在决定如何使用SQL时删除了它。@Luke:是的,我很久以前就知道了。在某些情况下?请在某些情况下,我会从床上掉下来,一颗小行星会撞击地球。总有一定的条件。一般情况如何?我的印象是,一般来说,可变表的性能比老式的临时表要好。@Graham.Reeds:确定吗,Graham?我一直在@table中插入/我跑掉了,测试一下。。往回跑。确认。它确实有效。请自己试一试。花了一秒钟。你真的读过你链接到的文章吗?在某些情况下,表变量的性能比临时表差得多。根据这一点,如果插入@table EXEC sp_someProcedure,则不能使用表变量,这正是我正在做的。@DelAvg应该位于逻辑的OR部分。我在决定如何使用SQL时删除了它。@Luke:是的,我很久以前就知道了。在某些情况下?请在某些情况下,我会从床上掉下来,一颗小行星会撞击地球。总有一定的条件。普通的/普通的呢
条件我的印象是,一般来说,可变表的性能比老式的临时表要好。@Graham.Reeds:确定吗,Graham?我一直在@table中插入/我跑掉了,测试一下。。往回跑。确认。它确实有效。请自己试一试。需要一秒钟。从不知道SP已经变得整洁了。我不知道SP已经走了。