Sql 存储过程中的逻辑
我需要存储过程中的一些逻辑。所有存储过程都执行一对逻辑规则,然后根据结果返回true或false 伪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
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已经走了。