- PR -

SQL ServerのT-SQLで

1
投稿者投稿内容
NEO
大ベテラン
会議室デビュー日: 2005/10/02
投稿数: 104
投稿日時: 2006-05-01 21:17
SQL Server2005でストアドプロシージャを作ろうと思うのですが、カーソルにパラメータを実装できないそうで困っています。

やりたいことは、
「ワークテーブルからSELECTして、別のテーブルにINSERT or UPDATEする」
です。

ワークテーブルからSELECTするところをカーソルにするのですが、SELECT条件は可変なので、その部分をパラメータでカーソルに渡したいのです。
Oracleならできたんですが・・・。

どうすれば実現できますか?
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2006-05-02 17:35
まだ2005を触ってすらいないのですが、2000ではカーソル定義をする際のSQLに普通にパラメタを使用しています。
http://msdn2.microsoft.com/ja-jp/library/ms180169(SQL.90).aspx
MSDNを見る限り、例に以下のような記述があります。
引用:

DECLARE product_cursor CURSOR FOR
SELECT v.Name
FROM Purchasing.ProductVendor pv, Production.Product v
WHERE pv.ProductID = v.ProductID AND
pv.VendorID = @vendor_id-- Variable value from the outer cursor


「パラメタ」とおっしゃっているのは、ここでの @vendor_id ですよね?
NEO
大ベテラン
会議室デビュー日: 2005/10/02
投稿数: 104
投稿日時: 2006-05-04 21:28
使えることはわかったんですけど、実際にプロシージャで使ってみると、カーソルから結果が返りません。
以下のように書いています。

CREATE PROCEDURE hoge(@param1 int) AS

DECLARE C1 CURSOR FOR
SELECT CODE_1 FROM TableA
WHERE COLUMN_1 = '0' AND COLUMN_2 = @param1

BEGIN
....

END

@param1をローカル変数に代入し、そのローカル変数をカーソルに書いても同じです。
また、カーソル定義の「@param1」をプロシージャ実行時の引数に渡していた数値に書き換えると結果は返ります。
T-SQLは初めてなもので原因が全く分かりません。
何が間違っているのでしょうか?
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2006-05-05 03:26
カーソル宣言部分だけ書かれても、正しい使い方がされているか判断できません。

簡単なストアドプロシジャ例を、下記に示します。
コード:
create table t1
(c1 int,
 c2 varchar(8))
insert into t1 values(1,'A')
insert into t1 values(1,'AA')
insert into t1 values(1,'AAA')
insert into t1 values(1,'AAAA')
insert into t1 values(2,'B')
insert into t1 values(2,'BB')
insert into t1 values(2,'BBB')

create procedure sp_hoge @ic1 int as
--カーソル使用例
declare @oc1  varchar(8)
declare @oc2  varchar(8)

--カーソル宣言
declare cr1 cursor for
 select * from t1 where c1=@ic1

--カーソルオープン
open cr1

--FETCH(行の取り出し)
fetch next from cr1 into @oc1,@oc2

--LOOP

while (@@fetch_status <> -1) --エラーまたはEOFでない間
begin
    if (@@fetch_status <> -2) --EOFでなければ何か処理をする
    begin
     print @oc2
    end
    --FETCH(行の取り出し)
    fetch next from cr1 into @oc1,@oc2
end

--カーソルクローズ
close cr1

return
go

--ストアドプロシージャ実行
exec sp_hoge 1

NEO
大ベテラン
会議室デビュー日: 2005/10/02
投稿数: 104
投稿日時: 2006-05-05 09:42
私の単純なコーディングミスでした。

ありがとうございました。
Xenon
会議室デビュー日: 2003/07/02
投稿数: 1
投稿日時: 2006-11-24 15:56
僕も6.5からの移行でハマりました

いわゆるSQLのパラメタというのは実行時(CURSORであればOPEN時)にバインドされるものと思いますが、SQL ServerのCURSORにはこの意味のパラメタは使用できないようです。

かめたろさんの挙げた、http://msdn2.microsoft.com/ja-jp/library/ms180169(SQL.90).aspx
に「カーソルを宣言する select_statement の一部として、変数を使用できます。カーソルが宣言された後、カーソル変数の値は変更されません。SQL Server のバージョン 6.5 以前では、カーソルが再オープンされるたびに変数の値が更新されます。」とあります。
(このページの例では カーソルのDECLAREとDEALLOCATEを繰り返しています)
1

スキルアップ/キャリアアップ(JOB@IT)