Передача наборов и необязательных параметров в хранимую процедуру T-SQL - ASP.NET

Большая задача для меня. У меня есть несколько вопросов. Вы, ребята, уже очень помогли мне, но я получаю одну трудность за другой и прогрессирующую невероятно медленно. Эти вопросы лучше описывают мои задачи.

У меня есть страница aspx со следующими элементами управления: TextBox, CheckBoxList, DropDownList. Они используются для указания критериев поиска. Записи берутся из базы данных SQL Server с помощью хранимой процедуры.

0) Это ясно, как передать текст из TextBox для поиска продукта по названию. Здесь нет вопросов.

1) Каждый CheckBox в CheckBoxList имеет значение, которое является фактическим идентификатором группы продуктов в базе данных. Если выбрано более одного флажка, как передать список идентификаторов в хранимую процедуру как набор, чтобы я мог использовать IN @IdList? Какие типы переменных следует использовать в С# и T-SQL? Возможно ли вообще?

2) DropDownList первый элемент - "ВСЕ". Когда выбрано "ALL", мне нужно передать что-то вроде NULL в хранимую процедуру. Как заставить хранимую процедуру игнорировать параметр, если он NULL?

Я измучен, идеи больше не появляются, я даже попытался выполнить поиск по каждому критерию отдельно, а затем поместить найденные идентификаторы в отдельные массивы, сравнить их и составить результирующий массив с общими идентификаторами, но было множество проблем, Я должен был использовать гигантские статические массивы, неэффективное использование памяти, не смог создать динамические массивы, не смог проверить пересечение только ненулевых элементов и т.д., Поэтому я отказался от этой идеи...

CREATE PROCEDURE FilterList
    @ProductName nvarchar(200),
    @ProductGroupID int
AS BEGIN 
SELECT 
    prod_id AS 'ID',
    prod_name AS 'Name'
FROM 
    dbo.Products
WHERE 
    prod_group_id = @ProductGroupID OR
    prod_name = @ProductName
END

Ответ 1

Вы можете получить дополнительные параметры в хранимых процедурах T-SQL, используя значения по умолчанию равные NULL.

Пример, где NULL используется как "игнорировать этот параметр":

CREATE PROCEDURE [dbo].[dcspFilterEmpList]
    @ProductName nvarchar(200) = null,
    @ProductGroupID int = null
AS BEGIN 

    SELECT
    prod_id AS 'ID',
    prod_name AS 'Name'
    FROM dbo.Products

    WHERE (prod_group_id = @ProductGroupID OR @ProductGroupID IS NULL)
    AND (prod_name = @ProductName OR @ProductName IS NULL)

END

Совершенно нормально определять хранимую процедуру для принятия параметра таблицы в T-SQL. Вот статья на эту тему http://sqlwithmanoj.wordpress.com/2012/09/10/passing-multipledynamic-values-to-stored-procedures-functions-part4-by-using-tvp/

Если вам нужна дополнительная информация об этом google для параметра "table-valued parameter"

Пример использования многозначных параметров:

CREATE TYPE XTV_ProductNames AS TABLE  --extension, table valued == XTV
( ProductName nvarchar(50))
GO
CREATE TYPE XTV_ProductGroups AS TABLE  --extension, table valued == XTV
( ProductGroupID int))
GO
CREATE PROCEDURE [dbo].[dcspFilterEmpList]
    @TVP1 XTV_ProductNames READONLY
    ,@TVP2 XTV_ProductGroups READONLY
AS BEGIN 
    SELECT
    prod_id AS 'ID',
    prod_name AS 'Name'
    FROM dbo.Products as p
    INNER JOIN @TVP1 as s
        ON p.prod_name = s.ProductName
    UNION
    SELECT
    prod_id AS 'ID',
    prod_name AS 'Name'
    FROM dbo.Products as p
    INNER JOIN @TVP2 as s
        ON p.prod_group_id = s.ProductGroupID
END

Ответ 2

Ваш ответ был верным Дэвидом, но он немного вводил в заблуждение, потому что параметр, равный NULL, не делает его необязательным; он просто должен быть установлен в любой период значений. Это также создает дополнительные параметры:

CREATE PROCEDURE [dbo].[dcspFilterEmpList]
    @ProductName nvarchar(200) = 'DefaultProduct',
    @ProductGroupID int = 1
AS

Таким образом, это может быть выполнено без передачи каких-либо параметров, то есть:

EXEC [dbo].[dcspFilterEmpList]

Я понимаю, что это не совсем то, что пытался сделать Писковец, но, похоже, он более точно соответствует фактическому вопросу о теме, и это важное различие.