質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Transact-SQL

Transact-SQLはSybase ASEとMIcrosoft SQLサーバで対応されているSQLの機能拡張版です。

Q&A

解決済

1回答

16390閲覧

カーソルが存在しないエラーの解決方法

yoshin

総合スコア39

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Transact-SQL

Transact-SQLはSybase ASEとMIcrosoft SQLサーバで対応されているSQLの機能拡張版です。

0グッド

0クリップ

投稿2016/01/18 02:21

編集2016/01/18 02:25

###前提・実現したいこと
ストアドプロシージャの勉強中です。
下記サイトのコードを作成し、実行したのですが、エラーが発生してしまいます。
http://www.atmarkit.co.jp/ait/articles/0209/12/news001.html
(処理内容はEmployeesテーブルから、各月ごとに誕生日を迎える社員を表示する処理になっています。)

エラーの発生原因と解決方法を教えてください。

###発生している問題・エラーメッセージ

メッセージ 16916、レベル 16、状態 1、プロシージャ SelectBirthdayMonth、行 48
名前 'EmployeeBirhtday' のカーソルは存在しません。

メッセージ 16916、レベル 16、状態 1、プロシージャ SelectBirthdayMonth、行 49
名前 'EmployeeBirhtday' のカーソルは存在しません。

(エラーメッセージからカーソルが上手く作成できていいないのかなと
推測はしているのですが。。。)

###ソースコード

【エラーが発生するストアドプロシージャ】

1 CREATE PROCEDURE [dbo].[SelectBirthdayMonth] AS
2 BEGIN
3 --変数とカーソルの宣言
4 DECLARE @EmployeeName NVARCHAR(10)
5 DECLARE @BirthDate DATETIME
6 DECLARE @Counter INT
7
8 DECLARE EmployeeBirthday CURSOR FOR
9 SELECT FirstName + LastName As EmployeeName,BirthDate
10 From Employees
11
12 --一時テーブルの作成
13 CREATE TABLE #Calendar
14 (BirthMonth INT PRIMARY KEY,
15 Employees NVARCHAR(100))
16
17 --初期化処理
18 SET NOCOUNT ON --
19
20 SET @Counter = 1
21 WHILE @Counter < 13
22 BEGIN
23 INSERT INTO #Calendar(BirthMonth,Employees)
24 VALUES(@Counter,'')
25 SET @Counter = @Counter + 1
26 END
27
28 --メイン処理
29 OPEN EmployeeBirthday
30
31 FETCH NEXT FROM EmployeeBirthday
32 INTO @EmployeeName,@BirthDate
33
34 WHILE @@FETCH_STATUS = 0
35 BEGIN
36 UPDATE #Calendar
37 SET Employees = Employees + @EmployeeName
38 + '(' + CAST(DAY(@BirthDate) AS NVARCHAR(2)) + ')'
39 WHERE BirthMonth = MONTH(@BirthDate)
40
41 FETCH NEXT FROM EmployeeBirthday
42 INTO @EmployeeName,@BirthDate
43 END
44
45 SELECT * FROM #Calendar
46
47 --終了処理
48 CLOSE EmployeeBirhtday
49 DEALLOCATE EmployeeBirhtday
50 END

【データベース】

テーブル名:Employees
列の定義:
列名 データ型
EmployeeID int
FirstName nvarchar(5)
LastName nvarchar(5)
BirthDate datetime

登録データ:

EmployeeID FirstName LastName BirthDate
1 あ い 2016-01-01 00:00:00.000
2 う え 2016-01-02 00:00:00.0003
3 か き 2016-02-04 00:00:00.000

###補足情報(言語/FW/ツール等のバージョンなど)
SQL Server2008 R2
Microsoft SQL Server Management Studio 10.50.2500.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

単純な綴りミスですかね・・・

EmployeeBirhtday ではなく、EmployeeBirthday では・・・・?

Birht ではなく、Birth 。。

投稿2016/01/18 02:31

編集2016/01/18 02:32
Toyoshima

総合スコア422

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問