1

我有三张桌子,

表格1

Fruit_Crate_ID (varchar)
Fruit_Crate_Name (varchar)
Fruit_Crate_Size (varchar)
Fruit_Crate_Price (varchar)

表 2

Fruit_Crate_ID (varchar)
Fruit_Eatable (Bool)

表3

Fruit_Crate_ID (integer)
Fruit_ID (integer)
Fruit_Eatable (Bool)

现在我需要创建一个首先检查的存储过程,

如果表 2是否可食用,则通过检查Fruit_Crate_ID如果它为假,则检查表 3是否可以食用Fruit_Crate_IDFruit_ID

USE [Database Name]
GO
CREATE PROCEDURE [dbo].[IsFruitEatable] 
    @Fruit_Crate_ID int,
    @Fruit_ID int
AS
BEGIN

if ((select Fruit_Eatable from Table2
where  Table1.Fruit_Crate_ID = @Fruit_Crate_ID))
{
   select Fruit_Eatable from Table3
   where  Table3.Fruit_Crate_ID = @Fruit_Crate_ID and Table3.Fruit_ID = @Fruit_ID
}

更新

我必须首先检查表 2,如果它说水果不可食用,那么无论水果 id 是什么,我都必须返回 false。

但是如果表 2 说水果箱可以食用,那么我必须检查水果本身是否可以食用。

谢谢

4

2 回答 2

4

您的查询包含 2 个错误:

  1. 您的 if 无效,检查查询是否返回任何内容是通过使用完成的exists
  2. 输入if您使用的子句begin .. end

这是正确的一个:

if exists (select Fruit_Eatable from Table2 where  Table2.Fruit_Crate_ID = @Fruit_Crate_ID)
begin
   select Fruit_Eatable from Table3
   where  Table3.Fruit_Crate_ID = @Fruit_Crate_ID and Table3.Fruit_ID = @Fruit_ID
end

已编辑的查询

USE [Database Name]
GO
CREATE PROCEDURE [dbo].[IsFruitEatable] 
    @Fruit_Crate_ID int,
    @Fruit_ID int
AS
BEGIN

  declare @isEatable bit = null

  if exists (select Fruit_Eatable from Table2 t2 where  t2.Fruit_Crate_ID = @Fruit_Crate_ID and t2.Fruit_Eatable = 1)
  begin
     select @isEatable = Fruit_Eatable
     from Table3 t3
     where  t3.Fruit_Crate_ID = @Fruit_Crate_ID and t3.Fruit_ID = @Fruit_ID
  end

  select isnull(@isEatable, 0) as IsFruitEatable
于 2013-07-04T10:16:22.060 回答
1

一种方法可以是:

USE [Database Name]
GO
CREATE PROCEDURE [dbo].[IsFruitEatable] 
    @Fruit_Crate_ID int,
    @Fruit_ID int
AS
BEGIN 
declare @Return bit = 0
select @Return = Fruit_Eatable 
  from Table3
 where Table3.Fruit_Crate_ID = @Fruit_Crate_ID 
   and Table3.Fruit_ID = @Fruit_ID 
   and EXISTS (select *
                 from Table2
                where Table1.Fruit_Crate_ID = @Fruit_Crate_ID)

select @Return
END
于 2013-07-04T10:22:15.800 回答