2009-04-16 9 views
6

我正在努力使用T-SQL過程,我希望你能提供幫助。給出布爾結果的T-SQL過程

我需要知道,如果

  1. 在表中存在一個給定的ID
  2. 如果一個(或多個)的行確實存在,那麼最新的一個有另一個ID設置爲5

因此,我們需要從第一個表中取出的表有兩個相關的ID:CaseID和LocationID,它們都是整數。第二個表有1個稱爲StateID的相關ID。

目前我可以得到該行是否存在於表部件中,但是當我試圖做任何事情時,企業管理器在END語句之前給出語法錯誤。

CREATE PROCEDURE [dbo].[HasActiveCase] 
(
    @LocationID INTEGER 
) 

AS 

DECLARE @CaseID AS INTEGER 
SELECT @CaseID=CaseID FROM dbo.Cases WHERE @LocationID=LocationID 

SELECT CASE WHEN 
    @CaseID IS NULL 
THEN 
    0 
ELSE 
    -- do something here to check CaseEvents.StateID is not 5 (closed) 
END 
GO 

可能有一種方法可以在JOIN中獲得我需要的東西,但我在這裏是一個完整的新手。

什麼是檢查StateID最簡單(明白)的方式不是5並將結果作爲真/假返回?(我知道SQLServer沒有布爾類型,但確實有位類型)

另外就樣式而言:ID中的值具有與它們關聯的文本字段 - CaseEvents.StateID具有例如文本「Closed」。 我是否應該將值作爲ID返回,然後替換代碼中的ID或返回ID已被文本替換的對象?一組中將不會有超過20或30個結果返回,並且該表將永遠不會非常大,因爲需要5年才能獲得2000個結果。

注意:不能使用LINQ(或任何其他的.NETTY),因爲這將從VB6程序調用。

更新

僅1例可在同一時間所以只有最近的一個項目是相關的開放。

在可能的情況已經是:

  1. 沒有過的情況下打開。這應該返回0.
  2. 以前已打開一個案件,但現在已關閉。這也應該返回0.
  3. 存在已打開的案例。這應該返回1.

回答

8

我認爲這個查詢將做你正在尋找;請注意,您現有的查詢存在一個錯誤,即如果存在多個案例,它將僅檢查是否發生了由初始查詢選擇的任何案例關閉(當然,如果可能有多個案例分配給特定位置)。

SELECT @CaseID = dbo.Cases.CaseID 
FROM dbo.Cases 
    JOIN dbo.CaseEvents ON dbo.Cases.CaseEventID = dbo.CaseEvents.CaseEventID 
WHERE @LocationID = dbo.Cases.LocationID 
    AND 5 != dbo.CaseEvents.StateID 

SELECT CASE WHEN @CaseID IS NULL THEN CAST(0 AS BIT) ELSE CAST(1 AS BIT) END AS CaseExists 
4

檢查是否適用於您。編輯

CREATE PROCEDURE [dbo].[HasActiveCase] 
(
    @LocationID INTEGER 
) 

AS BEGIN 
    DECLARE @CaseID AS INTEGER 
    SELECT @CaseID = CaseID FROM dbo.Cases WHERE @LocationID=LocationID 

    SELECT CASE WHEN 
     @CaseID IS NULL 
    THEN 0 
    ELSE CASE WHEN (SELECT COUNT(*) FROM CaseEvents WHERE StateID <> 5) > 0 THEN 0 ELSE 1 END 
    END 
END 
GO 
+0

我得到一個錯誤156:關鍵字'BEGIN'附近的語法不正確。在關鍵字'THEN'附近有正確的語法。 – 2009-04-16 14:26:30

+0

再次檢查,我更正了,更改了IF語法CASE語法 – 2009-04-16 14:35:04

+0

但是,檢查Edoode的答案,這也是非常好的 – 2009-04-16 14:37:34

1

這可能會實現,以及:

CREATE PROCEDURE [dbo].[HasActiveCase] 
(
    @LocationID INTEGER 
) 

AS 
    IF EXISTS (SELECT CaseID FROM dbo.Cases WHERE @LocationID=LocationID) 
    BEGIN 
     IF EXISTS (SELECT * FROM CaseEvents WHERE StateID <> 5) 
     SELECT 1 ELSE SELECT 0 
    END 
    ELSE 
    SELECT 0 

GO 
1

試試這個:

Select Case When Exists 
     (Select * From CaseEvents 
     Where CaseId = 
      (Select CaseID From Cases 
      Where LocationId = @Location) 
     And StateId = 5) -- Or <> 5 I'm not sure which you want here 
     Then 1 Else 0 End 
2

很多方法來解決這個問題,這裏有一個:

CREATE PROCEDURE [dbo].[HasActiveCase] 
(
    @LocationID INTEGER 
) 

AS 

DECLARE @CaseID AS INTEGER 
SELECT @CaseID=CaseID FROM dbo.Cases WHERE @LocationID=LocationID 

if (@CaseId IS NULL) 
BEGIN 
    SELECT 0 
END 
ELSE if EXISTS (SELECT * FROM CaseEvents WHERE StatusId=5 and [email protected]) 
BEGIN 
    SELECT 1 
END 
ELSE 
BEGIN 
    SELECT 0 
END 
GO 
-1
create procedure abc (id int) 
as 
declare @count int 
begin 
select @count=count(anycolumn) from table 
where [email protected] 
if @count>0 
return 1 
else 
return 0 
end