Как извлечь значение и использовать его в хранимой процедуре в одном запросе SQL? - PullRequest
1 голос
/ 19 января 2009

Я пишу клиент Silverlight, который взаимодействует с базой данных SQL через веб-службы ASP.NET 2.0, которые я также разрабатываю. Одна из служб должна возвращать результаты хранимой процедуры, и она работает хорошо. Однако один параметр хранимой процедуры должен быть извлечен из другого местоположения, прежде чем хранимая процедура может быть выполнена, и этот дополнительный запрос к базе данных вызывает очевидное замедление (очевидно, когда я кэширую полученное значение, а не получаю его при каждом вызове).

К сожалению, кэширование значения недопустимо для моей ситуации, и я бы предпочел объединить получение этого значения и последующее выполнение хранимой процедуры в одном запросе, чтобы сервер мог оптимизировать запрос. Тем не менее, мой SQL не силен, и я не имею ни малейшего представления, как мне поступить об этом.

На значение, назовем его tasktype, ссылаются одним ключом id. Хранимая процедура, getrecords, принимает несколько аргументов, включая tasktype, но можно предположить, что другие значения аргумента известны во время вызова запроса. Хранимая процедура возвращает таблицу записей.

Спасибо за любую помощь.

Ответы [ 2 ]

3 голосов
/ 19 января 2009

Ну, это может быть что-то вроде:

    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, ...
";

Однако вам, возможно, придется уточнить, как получить тип задачи.

Вы можете использовать это либо как IDataReader, либо используя DataTable.Load.

0 голосов
/ 19 января 2009

Вы должны быть в состоянии создать UDF, который будет получать значение типа задачи и вызывать его из своего источника данных.

Что-то вроде

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

затем от вашего вызова для извлечения данных

DECLARE tasktype int

SELECT tasktype = dbo.TaskType

или что-то в этом роде ... может потребоваться доработка: -)

...