2013-10-29 196 views
0

我在下面觸發了一個問題。謝謝你的幫助。SQL Server:插入觸發器

CREATE TRIGGER upper_case ON osoba 
AFTER INSERT AS 
BEGIN 
    DECLARE @imie VARCHAR(25) 
    DECLARE @new_imie VARCHAR(25) 
    DECLARE my_cursor CURSOR FAST_FORWARD FOR SELECT imie FROM INSERTED 

    OPEN my_cursor 
    FETCH NEXT FROM my_cursor INTO @imie 

    WHILE @@FETCH_STATUS = 0 
     BEGIN 
      @new_imie = UPPER(SUBSTRING(@imie, 1, 1)) + SUBSTRING(@imie, 2,LEN(@imie)) 
     END 
     UPDATE osoba 
     SET imie = @new_imie WHERE imie = @imie 
END 

錯誤消息:

消息102,級別15,狀態1,過程UPPER_CASE 13行
附近有語法錯誤@new_imie'。
Msg 102,Level 15,State 1,Procedure upper_case,Line 17
'END'附近語法不正確。

+5

在**觸發器中使用**遊標**是關於您在SQL Server中可以做的最糟糕的事情。你應該不惜一切代價避免這種情況!觸發器應該非常精簡,非常高效,並且運行時間絕對最短..... –

+2

您是否關閉並取消分配光標? – AllenG

+0

它應該做什麼?它似乎沒有做任何事情。 – RBarryYoung

回答

5

別爲此使用光標。

您可以使用一個UPDATE語句來同時影響所有行,而不是逐個處理它們。

CREATE TRIGGER upper_case 
ON osoba 
AFTER INSERT 
AS 
    BEGIN 
     UPDATE O 
     SET imie = UPPER(SUBSTRING(I.imie, 1, 1)) + SUBSTRING(I.imie, 2, LEN(I.imie)) 
     FROM INSERTED I 
      JOIN osoba O 
       ON I.imie = O.imie 
    END 
0

你的任務,以@new_imie需要在它前面的SET關鍵字...

SET @new_imie = UPPER(SUBSTRING(@imie, 1, 1)) + SUBSTRING(@imie, 2,LEN(@imie)) 
1

你應該使用SET當你將@new_imiemsdn):

SET @new_imie = UPPER(SUBSTRING(@imie, 1, 1)) + SUBSTRING(@imie, 2,LEN(@imie));