2011-09-15 36 views
0
DECLARE @FirstName NVARCHAR(50), 
     @MiddleName NVARCHAR(50), 
     @LastName NVARCHAR(50), 
     @Email NVARCHAR(50), 
     @EmployeeID INT, 
     @FN NVARCHAR(MAX), 
     @MN NVARCHAR(MAX), 
     @LN NVARCHAR(MAX) 

DECLARE cur CURSOR FOR 
    SELECT FirstName 
       , MiddleName 
       , LastName 
       , Username 
    FROM temp 

    OPEN cur 
     FETCH NEXT FROM cur 
     INTO @FirstName, @MiddleName, @LastName, @Email 

     WHILE @@FETCH_STATUS = 0 
     BEGIN 

      DECLARE cur2 CURSOR FOR 
       SELECT EmployeeID 
         , FirstName 
         , MiddleName 
         , LastName 
       FROM HRIS_Employees 

       OPEN cur2 
        FETCH NEXT FROM cur2 
        INTO @EmployeeID, @FN, @MN, @LN 

        WHILE @@FETCH_STATUS = 0 
        BEGIN 
         CASE 
          WHEN ((@FN = @FirstName 
          AND @MN = @MiddleName)) 
          AND @LN = @LastName) THEN 

          UPDATE HRIS_EmployeeContacts 
          SET  Email = @Email 
          WHERE HRIS_EmployeeContacts.EmployeeID = @EmployeeID 
         END 

         FETCH NEXT FROM cur2 
         INTO @EmployeeID, @FN, @MN, @LN 

        END 
       CLOSE cur2 
       DEALLOCATE cur2 

      FETCH NEXT FROM cur 
      INTO @FirstName, @MiddleName, @LastName, @Email; 

     END 

    CLOSE cur 
DEALLOCATE cur 

发生错误,表示“关键字'CASE'附近的语法不正确。”是否可以在SQL Server 2008的While循环中放置CASE表达式?

回答

2

CASE不是控制流量表。这是一个运营商。你想要IF - ELSE

2

我认为你正在使用CASE你真的需要一个IFCASE只能在表达式中使用,而IF是流量控制关键字。

替换此:

CASE 
WHEN ((@FN = @FirstName AND @MN = @MiddleName)) AND @LN = @LastName) THEN 

UPDATE HRIS_EmployeeContacts 
SET  Email = @Email 
WHERE HRIS_EmployeeContacts.EmployeeID = @EmployeeID 
END 

与此:

IF ((@FN = @FirstName AND @MN = @MiddleName)) AND @LN = @LastName) 
    BEGIN 
    UPDATE HRIS_EmployeeContacts 
    SET  Email = @Email 
    WHERE HRIS_EmployeeContacts.EmployeeID = @EmployeeID 
    END 

此外,该光标针对一个临时表的光标的内部是一个怪物稍微的。您可能会考虑将其重新设计为根本不使用游标。

1

你并不需要一个case语句和IF将工作

IF (((@FN = @FirstName AND @MN = @MiddleName)) AND @LN = @LastName) 
    BEGIN 
     UPDATE HRIS_EmployeeContacts 
     SET  Email = @Email 
     WHERE HRIS_EmployeeContacts.EmployeeID = @EmployeeID 
    END 
5

为什么这是一个光标呢?你可以用一个UPDATE语句来替换所有的面食:

UPDATE e 
    SET e.Email = t.Username 
    FROM dbo.HRIS_EmployeeContacts AS e 
    INNER JOIN dbo.temp AS t 
    ON t.FirstName = e.FirstName 
    AND t.MiddleName = e.MiddleName 
    AND t.LastName = e.LastName; 
+0

这应该是真正的答案,他的问题,这个问题仅仅是一个语法问题,这个问题应该重新措辞或关闭。 – GalacticJello