将集合和可选参数传递给存储过程T-SQL-ASP.NET

将集合和可选参数传递给存储过程T-SQL-ASP.NET,asp.net,tsql,stored-procedures,set,optional-parameters,Asp.net,Tsql,Stored Procedures,Set,Optional Parameters,我有一个带有以下控件的aspx页面:TextBox、CheckBoxList、DropDownList。 它们用于指定搜索条件。这些记录是使用存储过程从SQL Server数据库中获取的 复选框列表中的每个复选框都有一个值,该值是数据库中产品组的实际ID。如果选中了多个复选框,如何将ID列表作为一个集合传递给存储过程,以便在@IdList中使用?在C和T-SQL中应该使用哪些变量类型?有可能吗 DropDownList的第一项是全部。当选择ALL时,我需要向存储过程传递NULL之类的内容。如果参

我有一个带有以下控件的aspx页面:TextBox、CheckBoxList、DropDownList。 它们用于指定搜索条件。这些记录是使用存储过程从SQL Server数据库中获取的

复选框列表中的每个复选框都有一个值,该值是数据库中产品组的实际ID。如果选中了多个复选框,如何将ID列表作为一个集合传递给存储过程,以便在@IdList中使用?在C和T-SQL中应该使用哪些变量类型?有可能吗

DropDownList的第一项是全部。当选择ALL时,我需要向存储过程传递NULL之类的内容。如果参数为NULL,如何使存储过程忽略该参数

创建过程过滤器列表 @产品名称nvarchar200, @ProductGroupID int 作为开始 选择 产品id为“id”, 产品名称为“名称” 从…起 dbo.产品 哪里 prod_group_id=@ProductGroupID或 产品名称=@ProductName 结束


通过使默认值等于NULL,可以在T-SQL存储过程中实现可选参数

使用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中定义一个存储过程来获取表值参数是非常好的。 这里有一篇关于这个主题的文章

如果您需要有关此google for表值参数的更多信息

使用多值参数的示例:

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
CREATE PROCEDURE [dbo].[dcspFilterEmpList]
    @ProductName nvarchar(200) = 'DefaultProduct',
    @ProductGroupID int = 1
AS

David,您的回答是正确的,但有点误导,因为等于NULL的参数并不使其成为可选的;它只需设置为任何值周期。这也会创建可选参数:

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
CREATE PROCEDURE [dbo].[dcspFilterEmpList]
    @ProductName nvarchar(200) = 'DefaultProduct',
    @ProductGroupID int = 1
AS
因此,可以在不传递任何参数的情况下执行,即:

EXEC [dbo].[dcspFilterEmpList]

我知道这不一定是Piscovetz想要做的,但它似乎更符合实际的主题问题,这是一个重要的区别。

很高兴听到这一点。祝你好运。我现在在你的帮助下了解到,如果过程设置了值,那么调用时它将是可选的。不管是NULL还是某个值,只要它在过程定义中被设置就无关紧要了?@DavidSöderlund:是的。