Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Передача параметров в хранимую процедуру


Автор: Wilko 29.8.2011, 10:55
Как можно передавать параметры в хранимую процедуру для использования с оператором IN?
Есть листбокс с возможностью выбора множества значений.
Пользователь выбирает ноль или больше значений в этом поле, и этот параметр должен передаваться хранимой процедуре. Процедура вида
Код

CREATE PROCEDURE [dbo].[GetQuerys]
(@RowIndex INT ,
@MaxRows INT,
@Employees nvarchar(50) = null)    
AS
BEGIN
DECLARE @StartRow INT
DECLARE @EndRow INT
 
SET @StartRow = (@RowIndex+1)
SET @EndRow = @StartRow + @MaxRows

    SET NOCOUNT ON;
    SELECT  * FROM (SELECT Q.ID AS Number,E.ShortName,                       
                        ROW_NUMBER() OVER (ORDER BY Q.ID) numberrow                        
                    FROM Queries Q
                        INNER JOIN Employees E ON (E.ID = Q.EmployeeID)                        
                    WHERE E.ID IN (@Employees)
                    ) input  
    WHERE input.numberrow BETWEEN @StartRow AND @EndRow
END

Как можно передать параметр Employee в эту хранимую процедуру? 

Автор: jonie 29.8.2011, 14:06
Цитата(Wilko @  29.8.2011,  11:55 Найти цитируемый пост)

Как можно передать параметр Employee в эту хранимую процедуру?  

можно:
1. как XML передавать (начиная с MSSQL2005)
2. создать предварительно таблицу (из C#) в этой же сесии с #-ки начинающуюся  использовать в SP её (только SP вызывать из той же сессии иначе таблица умрет).
3. передать ID через запятую и в SQL их пропарисить - гугли про "text to table mssql function delimeter" словам.
4. создать UDF и использовать его (изврат наверно)
5. можно передать текстом через запятую, но в SQL тогда использовать динамический sql, который исполнять через EXEC...

Автор: Wilko 29.8.2011, 14:11
Видимо забыл добавить, что этот параметр может отсутствовать, т.е. быть NULL(пользователь не выбрал критерия для фильтрации, вывести все записи). Если в других случаях проверки на ISNULL достаточно, то тут такого не пройдет. Только динамический sql подойдет в таком случае?

Автор: jonie 29.8.2011, 14:16
Почему это "только динамический" ?
Код

....
where field in (some) or some IS NULL

Автор: Wilko 29.8.2011, 14:37
Спасибо, пока работает  smile 

Автор: Wilko 30.8.2011, 11:15
Понимаю ,может быть стоило создать новую тему или лучше поискать, но задам вопрос здесь)
Эта процедура используется для создания пейджинга, и, конечно же, хотелось бы сразу из нее получать количество строк в резлуьтирующем наборе. Вот только 
Код

SET @PageCount = @@ROWCOUNT

 - не работает, т.к. его можно применить только после всего запроса, а он ограничивает наши записи с помощью @StartRow и @EndRow.
Как можно получить количество записей, которые были выбраны в результате вложенного запрос:
Код

SELECT Q.ID AS Number,E.ShortName,                       
                        ROW_NUMBER() OVER (ORDER BY Q.ID) numberrow                        
                    FROM Queries Q
                        INNER JOIN Employees E ON (E.ID = Q.EmployeeID)                        
                    WHERE E.ID IN ("что-то")

И записать их в переменную @PageCount?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)