Правильный синтаксис для сложной инструкции CASE внутри курсора - PullRequest
0 голосов
/ 13 октября 2011

Мне нужна помощь с правильным синтаксисом для моего оператора CASE внутри моего курсора.

Справочная информация. Я хочу, чтобы этот оператор CASE просматривал таблицу Concatenated_File, а в столбце FileID - любую строку с именем «File1». Я хочу обновить MRNID в соответствующей таблице с названием Load_File_1. , И я хочу продолжить утверждение CASE о том, что для любой строки с именем «File2» я хочу обновить MRNID в соответствующей таблице Load_File_2.

Это то, что у меня есть, но я не могу понять правильный синтаксис. Любая помощь будет оценена. Спасибо.

DECLARE @FILEID AS VARCHAR(255)
DECLARE @MRNID AS VARCHAR(255)
DECLARE @UniqueID AS VARCHAR(255)
DECLARE @LNAME AS VARCHAR(255)
DECLARE @FNAME AS VARCHAR(255)
DECLARE @Birthdate AS VARCHAR(255)
DECLARE @SSN AS VARCHAR(255)
DECLARE @HOLD_MRNID AS VARCHAR(255)
DECLARE @HOLD_UniqueID AS VARCHAR(255)
DECLARE @HOLD_LNAME AS VARCHAR(255)
DECLARE @HOLD_FNAME AS VARCHAR(255)
DECLARE @HOLD_Birthdate AS VARCHAR(255)
DECLARE @HOLD_SSN AS VARCHAR(255)

SET NOCOUNT ON
DECLARE curDB CURSOR FAST_FORWARD FOR

-----------------------------------------------
SELECT UniqueID, MRNID, LNAME, FNAME, Birthdate, SSN
FROM Concatenated_File
ORDER BY LNAME, FNAME, Birthdate, SSN
-----------------------------------------------

-- initialize variables
select @FILEID=''
select @MRNID=''
select @UniqueID=''
select @FNAME=''
select @LNAME=''
select @Birthdate=''
select @SSN=''
select @HOLD_MRNID=''
select @HOLD_UniqueID=''
select @HOLD_FNAME=''
select @HOLD_LNAME=''
select @HOLD_Birthdate=''
select @HOLD_SSN=''

OPEN curDB

FETCH NEXT FROM curDB into @FILEID, @MRNID, @UniqueID, @FNAME, @LNAME, @Birthdate, @SSN
WHILE (@@FETCH_STATUS = 0)
  BEGIN

        IF @LNAME = @HOLD_LNAME and @FNAME = @HOLD_FNAME and @Birthdate = @HOLD_Birthdate and @SSN = @HOLD_SSN
              BEGIN

                    select @FILEID
                        CASE
                            When @FILEID = 'File1' Then
                            Update Load_File1
                            Set MRNID = @HOLD_MRNID
                            Where UniqueID = @UniqueID

                            When @FILEID = 'File2' Then
                            Update Load_File2
                            Set MRNID = @HOLD_MRNID
                            Where UniqueID = @UniqueID



              END
        ELSE

              BEGIN
                    select @HOLD_UniqueID = @UniqueID
                    select @HOLD_MRNID = @MRNID
                    select @HOLD_FNAME = @FNAME
                    select @HOLD_LNAME = @LNAME
                    select @HOLD_Birthdate = @Birthdate
                    select @HOLD_SSN = @SSN
              END
        FETCH NEXT FROM curDB into @FILEID, @MRNID, @UniqueID, @FNAME, @LNAME, @Birthdate, @SSN
  END

ЗАКРЫТЬ curDB DEALLOCATE curDB

1 Ответ

1 голос
/ 13 октября 2011

CASE - это не нужная вам конструкция управляющего потока IF

IF @FILEID = 'File1'
    UPDATE Load_File1
    SET MRNID = @HOLD_MRNID
    WHERE UniqueID = @UniqueID
ELSE IF @FILEID = 'File2'
    UPDATE Load_File2
    SET MRNID = @HOLD_MRNID
    WHERE UniqueID = @UniqueID

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

...