1

次のコードに簡略化されたストアド プロシージャがあります。

SET NOCOUNT ON

DECLARE @count INT
DECLARE @temp TABLE
INSERT INTO @temp
SELECT @count = count(*) FROM @temp

DECLARE [cursor] FOR SELECT id FROM @temp
OPEN [cursor] FETCH NEXT FROM [cursor] INTO @id WHILE @@fetch_status = 0
BEGIN
    exec anoterStoredProc @id
FETCH NEXT FROM [cursor] INTO @id
END
CLOSE [cursor]
DEALLOCATE [cursor]

SET NOCOUNT OFF

RETURN @count

それでもExecuteNonQuery()-1 を返します。

使用できますがselect @countExecuteScalar()コードが機能しない理由を理解したいです。

サーバーの動作をNOCOUNT OFFリセットせず、NOCOUNT ONまだそのままのようです。

4

2 に答える 2

3

まず、SET ROWCOUNTを台無しにしないでください-これは非常に危険なことをします(誤って使用された場合)。

戻り値は、実際にはReturnValueの「方向」を持つパラメーターを追加することによって処理されます。または、値をSELECTして、ExecuteScalarを使用します。

于 2012-05-08T17:35:19.197 に答える
1

SET ROWCOUNT xx後続のすべてのクエリによって返される行数を制限するために使用されます。スカラー値を返すためには使用されません。

RETURN xxプロシージャを呼び出すプロセスに整数値を返すために使用されます。通常、これは成功(ゼロ)または失敗(ゼロではなく、おそらくエラー番号)を示すために使用されます。特定の値については、出力パラメーターの方が便利な場合があります。

[追加]SET NOCOUNTは斜めのコマンドです。オフの場合、クエリの実行(選択、更新、挿入、削除)ごとに情報が返されます。オンの場合、そうではありません。(したがって、これをオフに設定しても効果はありません。)重要なのは、この情報は戻り値、パラメーター値、またはデータセットではなく、別の何かです(そして、それは数値ですか?文字列ですか?私です)。 mわからない)。私が今まで聞いたすべてのことから、作業するのは苦痛です。そのため、私は常にストアドプロシージャをで開始しSET NOCOUNT onます。

どちらの場合も、@countがどこで定義または割り当てられているのかわかりません。

于 2012-05-08T17:35:59.473 に答える