2017-10-06 11 views
0

テーブルを作成し、それに数行を追加しました。ここにそのスクリプトがあります。CURSORを使用した単純な列の更新

SET ANSI_NULLS ON 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[xEmployee] 
(
    [EmpID] [int] NOT NULL, 
    [EmpName] [varchar](50) NOT NULL, 
    [Salary] [int] NOT NULL, 
    [Address] [varchar](200) NOT NULL, 
    [YearlySalary] [int] NULL, 

    PRIMARY KEY CLUSTERED ([EmpID] ASC) 
) ON [PRIMARY] 
GO 

INSERT INTO [dbo].[xEmployee] ([EmpID], [EmpName], [Salary], [Address], [YearlySalary]) 
VALUES (1, N'Mohan', 12000, N'Noida', NULL), 
     (2, N'Pavan', 25000, N'Delhi', NULL) 
GO 

あなたが見ることができるように、私はすでに存在Salary列とそのデータを持っています。私はYearlySalaryという名前の列をもう1つ追加しました。これは現在nullです。

このYearlySalary列をカーソルで更新する必要があります。したがって、1行目と2行目はYearlySalary = Salary * 12である必要があります。

以下に示すようにカーソルを使用しようとしています。しかし、何かが行方不明であるか、あるいは正しくない。誰かが私が間違っている場所を教えてもらえますか?

SET NOCOUNT ON 
DECLARE @salary int 
DECLARE @id int 
DECLARE @yearlySalary int 

DECLARE tempCursor CURSOR STATIC FOR 
    SELECT EmpID,Salary, YearlySalary 
    FROM dbo.xEmployee 

OPEN tempCursor 

IF @@CURSOR_ROWS > 0 
BEGIN 
     FETCH NEXT FROM tempCursor INTO @salary 

     WHILE @@FETCH_STATUS = 0 
     BEGIN 
      @yearlySalary = @salary * 12 

      INSERT INTO dbo.xEmployee (EmpId, Salary,YearlySalary) 
      VALUES (@id, @salary, @yearlySalary) 
     END 
END 

CLOSE tempCursor 
DEALLOCATE tempCursor 
SET NOCOUNT OFF 

答えて

0

私は自分で物事をするにはもっと忍耐力が必要です。私はちょっとした簡単な例のためにカーソルを試したかったので、後でそれをより強くするために使うことができます。ここで私はそれを働かせることができた方法です。みんなありがとう。

SET NOCOUNT ON 
DECLARE @salary int 
DECLARE @Id int 

DECLARE tempCursor CURSOR STATIC FOR 
    SELECT EmpId, Salary 
    FROM dbo.xEmployee 

OPEN tempCursor 

IF @@CURSOR_ROWS > 0 
BEGIN 
    FETCH NEXT FROM tempCursor INTO @Id, @salary 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     print @salary 

     UPDATE dbo.xEmployee 
     SET YearlySalary = (@salary * 12) 
     WHERE EmpID = @Id; 

     FETCH NEXT FROM tempCursor INTO @Id, @salary 
    END 
END 

CLOSE tempCursor 
DEALLOCATE tempCursor 
SET NOCOUNT OFF 
3

なぜこのようなカーソルを使用しますか? updateは十分であろうと思われる:あなたがカーソルを避けるべき

update dbo.xEmployee 
    set YearlySalary = Salary * 12; 

、セットベースの操作を好みます。状況によっては、カーソルが必要ですが、これは単純ではありません。

+0

私はカーソルを使用して通常の例を試しています。私は更新がカーソルを使わずに動作することを知っています – Rihana

+1

@リハナ。 。 。あなたのカーソルコードが 'insert'ではなく' update'を使用していれば助けになります。しかし、カーソルが適切な場所で問題が発生した場合は、動的SQLの行に沿って何かを考えてください。ビューの定義を含む表を作成し、表をループしてビューを定義します。 –

関連する問題