2013-07-04 56 views
1

我有三個表,爲什麼越來越語法錯誤此SQL存儲過程

表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第一,如果說,水果不食用,然後我必須返回false無論水果的ID。

但是如果表2說水果箱是可食用的,那麼我必須檢查水果本身是否可以食用。

感謝

+1

..你有花括號,這是不是在T-SQL作用域。此外,你似乎期望從該表達式布爾結果。 –

回答

4

查詢包含2個錯誤:

  1. 你如果是無效的,請檢查是否有任何被查詢返回的做用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 
+0

使用NOT EXISTS將強制表掃描;這可能不是一個問題,但可能是如果表格非常大和/或索引很差。 – Tim

+0

如果水果箱不可食用,此存儲過程是否也會返回false?非常感謝:-) – Mathematics

+0

我看到這篇文章已經更新,更清晰的結果應該是什麼樣子。僅將其恢復爲「存在」。 – gzaxx

相關問題