2011-10-12 59 views
0

我需要我的Cursor中的CASE語句正確的syntx幫助。光標內部的複雜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 

CLOSE curDB DEALLOCATE curDB

回答

1

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 

我不知道到底是什麼光標更新邏輯在做什麼。一般來說,你最好使用基於集合的技術。

+0

非常感謝。我有一個想法,我需要一個IF ... ELSE語句,但我不確定。它效果很好。再次感謝! – user992263