Процедура T-SQL, дающая логический результат - PullRequest
6 голосов
/ 16 апреля 2009

Я борюсь с процедурой T-SQL и надеюсь, что вы можете помочь.

Мне нужно знать, если

  1. В таблице существует строка для данного идентификатора
  2. Если один (или более) существует, то у самого последнего другой идентификатор установлен на 5.

Итак, первая таблица, из которой нам нужно получить строку, имеет два соответствующих идентификатора: CaseID и LocationID, оба являются целыми числами. Вторая таблица имеет 1 соответствующий идентификатор, называемый StateID.

В настоящее время я могу узнать, существует ли строка в части таблицы, но как только я пытаюсь что-либо сделать, Enterprise Manager выдает синтаксическую ошибку перед оператором 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 и возвращение результата как true / false? (я знаю, что SQLServer не имеет логического типа, но имеет Тип бит вместо.)

Также по стилю: со значениями в идентификаторах связано текстовое поле - например, CaseEvents.StateID имеет текст «Закрыто». Должен ли я возвращать значения в качестве идентификаторов и затем заменять идентификатор в коде или возвращать объекты с идентификатором, уже замененным текстом? Никогда не будет более 20 или 30 результатов, возвращаемых в наборе и таблице никогда не будет очень большим, так как для получения 2000 результатов понадобится 5 лет.

ПРИМЕЧАНИЕ : Нельзя использовать linq (или что-либо еще .NETty), потому что это будет вызвано из программы VB6.

Обновление

Одновременно может быть открыт только 1 случай, поэтому релевантным будет только самый последний элемент.

Возможные ситуации:

  1. Ни одно дело не было открыто. Это должно вернуть 0.
  2. Дело было ранее открыто, но теперь закрыто. Это тоже должно вернуть 0.
  3. Открытое дело существует. Это должно вернуть 1.

Ответы [ 6 ]

8 голосов
/ 16 апреля 2009

Я думаю, что этот запрос будет делать то, что вы ищете; Обратите внимание, что в вашем существующем запросе есть ошибка, заключающаяся в том, что если существует более одного случая, он будет проверять, будет ли закрыт случай, выбранный в результате первоначального запроса (конечно, это верно только в том случае, если возможно иметь более одного случая назначается определенному месту).

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 голосов
/ 16 апреля 2009

Проверьте, работает ли это для вас. Под редакцией

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
2 голосов
/ 16 апреля 2009

Множество способов решить эту проблему, вот один:

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 CaseId=@CaseId)
BEGIN
    SELECT 1
END
ELSE
BEGIN
    SELECT 0
END
GO
1 голос
/ 16 апреля 2009

Попробуйте это:

  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
1 голос
/ 16 апреля 2009

Это также может сработать:

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
0 голосов
/ 10 августа 2009
create procedure abc (id int)
as
declare @count int
begin
select @count=count(anycolumn) from table
where id=@id
if @count>0
return 1
else 
return 0
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...