2009-01-19 4 views
1

J'écris un client Silverlight qui interagit avec une base de données SQL via les services Web ASP.NET 2.0, que je développe également. L'un des services doit renvoyer les résultats d'une procédure stockée et cela fonctionne bien. Toutefois, un paramètre de la procédure stockée doit être extrait d'un emplacement différent avant que la procédure stockée puisse être exécutée et cette demande supplémentaire à la base de données entraîne un ralentissement évident (évident lorsque je cache la valeur récupérée plutôt que de l'obtenir tous les appels).Comment récupérer une valeur et l'utiliser dans une procédure stockée dans une requête SQL?

Malheureusement, la mise en cache de la valeur n'est pas valide pour ma situation et je préfère combiner la récupération de cette valeur et l'exécution de la procédure stockée suivante en une seule requête afin que le serveur puisse optimiser la requête. Cependant, mon SQL n'est pas fort et je n'ai pas la moindre idée de la façon dont j'y vais.

La valeur, appelons-la tasktype, est référencée via une seule clé, id. La procédure stockée, getrecords, prend quelques arguments dont tasktype, mais on peut supposer que les autres valeurs d'argument sont connues au moment de l'appel de la requête. La procédure stockée renvoie une table d'enregistrements.

Merci pour toute aide.

+0

Utilisez-vous un sproc scalaire pour obtenir la valeur pour tasktype? –

+0

La valeur de tasktype est obtenue via une requête SQL régulière. Il n'y a actuellement aucune procédure stockée pour cela. –

Répondre

3

Eh bien, il pourrait être quelque chose comme:

cmd.CommandType = CommandType.Text; 
    cmd.Parameters.AddWithValue("@id", ...); // your id arg 
    cmd.Parameters.AddWithValue(... , ...); // your other args... 
    cmd.CommandText = @" 
DECLARE @TaskType int -- or whatever 

SELECT @TaskType = // some existing query based on @id 

EXEC getrecords @TaskType, ... 
"; 

Cependant, vous devrez peut-être de clarifier la façon d'obtenir une tâche de type. Vous devriez pouvoir consommer ceci comme IDataReader, ou en utilisant DataTable.Load.

+0

La valeur tasktype est obtenue à l'aide d'une requête SELECT régulière. Il n'y a aucune procédure stockée pour l'obtenir en ce moment. –

+0

Merci. Je savais que cela devait être simple. Très appréciée. –

0

Vous devriez être capable de créer un UDF qui obtiendra la valeur de tasktype et l'appeler depuis votre sproc de récupération de données.

Quelque chose comme

CREATE FUNCTION dbo.TaskType() 
Returns int 
    SELECT ... stuff that gets task type 
END 

puis de votre récupération de données sproc appel

DECLARE tasktype int 

SELECT tasktype = dbo.TaskType 

ou quelque chose comme ça ... peut-être besoin d'un peu de retravaillant :-)