2010-12-10 32 views
1

contexte Problème: J'utilise VisualStudio 2008 et des ensembles de données typés, qui offrent un « facile » accès à executescalar() exécutons scalaire renvoie la valeur du premier champ de la première ligne de la première recorset (cette dernière partie étant souvent omis)Comment empêcher proc stocké de renvoyer des jeux d'enregistrements intermédiaires?

le problème avec ce comportement est que le plus souvent que vous voulez faire d'autres demandes avant vous calculer la valeur à retourner avec une déclaration finale select @returnValue.

Donc, ma question est, en général, Comment empêcher un SP de retourner des jeux d'enregistrements intermédiaires? (I SET essayé FMTONLY ON/OFF, mais est a un comportement latéral indésirable)

Une autre question connexe est: comment empêchez-vous une instruction UPDATE T-SQL de retourner les lignes mises à jour? Parfois, vous utilisez UPDATE pour simplement mettre à jour ...

merci!

échantillon

:

BEGIN

SET NOCOUNT ON; 

declare @c int 
select @c=(select count(*) from work where ...) 
select @c -- so ExecuteScalar() works 
update sousblocs set myfield = @c 
     where ... 

select @c --after the update, won't be seen by ExecuteScalar() 
return @c --useless for ExecuteScalar 

FIN

ce fut mon problème, et il peut être résolu avec le premier "select @c"; mais je me demande néanmoins si vous pouvez désactiver la sortie de recorset ....

+1

"vous voulez faire d'autres demandes" - s'il vous plaît nous montrer un exemple de code d'un de vos sprocs pour illustrer ce que vous voulez dire ici – AakashM

+0

Par exemple, vous calculez une valeur à stocker avec une mise à jour, et vous vouloir retourner cette valeur. Dans ce cas, la mise à jour sera le premier jeu d'enregistrements à retourner – oldbrazil

Répondre

1

1 - Ne pas avoir plusieurs instructions de sélection dans votre proc stocké sans cible. C'est à dire. Si vous exécutez SELECT 1,2,3, puis SELECT 4,5,6, il retournera 2 enregistrements.

2 - Je ne sais pas pourquoi vous récupérez des enregistrements lorsque vous exécutez une mise à jour. Essayez de définir SET NOCOUNT ON pour désactiver les messages "xx rows affected".

+0

"SET NOCOUNT ON" déjà défini. les messages retournés ne sont pas le problème. Des instructions telles que "select @ var = somefunc (..." ne renvoient pas de jeu d'enregistrements, et il n'y a pas de point dans SELECTING si vous ne voulez pas un jeu d'enregistrements, mais la mise à jour est un problème ... sauf si vous considérez que vous mettez à jour avec une valeur connue, que vous pouvez sélectionner au préalable ... – oldbrazil

+1

@oldbrazil - Qu'est-ce que vous obtenez exactement? – JNK