2

変数を sp_executesql に渡すときに変数を「カーソル」型として宣言しているにもかかわらず、「オペランド型の衝突: nvarchar はカーソルと互換性がありません」というエラーが表示されます。

declare CURSOR_TO_PASS cursor for... --a simple select statement
--cursor opened, values obtained, etc...
declare @item nvarchar(5);
declare @seqno int;
--@item and @seqno populated
declare @sql nvarchar(400) = N'update MYTABLE set Survey' + cast(@seqno as nvarchar(2)) + N' = @itemvalue where current of @sc';
exec sp_executesql @sql, N'@itemvalue nvarchar(5), @sc cursor', @itemvalue = @item, @sc = CURSOR_TO_PASS;

@sc をカーソルとして宣言しており、CURSOR_TO_PASS はカーソルであり、sp_executesql を呼び出すときに @sc に割り当てているため、何が問題なのかわかりません。では、カーソルを sp_executesql に渡すことは可能ですか?

4

1 に答える 1

3

これを投稿した直後に解決策を見つけました。実際、カーソル変数を渡すことは可能です。ここに示されているように、カーソルを「カーソル変数」に割り当てる必要がある中間ステップが必要です: http://msdn.microsoft.com/en-us/library/ms190028.aspx 2 つの方法のいずれかによるカーソル変数:" どちらの方法も、"DECLARE @MyVariable CURSOR;" のような最初の基本的なカーソル変数宣言を必要とします。

そこで、次の行をコードに追加しました。

declare @cursorvariable cursor;
set @cursorvariable = CURSOR_TO_PASS;

その後、に変更@sc = CURSOR_TO_PASSしましたが@sc = @cursorvariable、うまくいきました。

于 2011-07-11T18:25:00.210 に答える