【问题标题】:Passing sets and optional parameters to a stored procedure T-SQL - ASP.NET将集合和可选参数传递给存储过程 T-SQL - ASP.NET
【发布时间】:2013-04-16 13:49:12
【问题描述】:

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

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

  2. DropDownList 的第一项是“ALL”。选择“ALL”时,我需要将 NULL 之类的内容传递给存储过程。如果参数为NULL,如何使存储过程忽略参数?

    创建过程过滤器列表 @ProductName nvarchar(200), @ProductGroupID 整数 开始 选择 prod_id AS 'ID', prod_name 作为“名称” 从 dbo.产品 在哪里 prod_group_id = @ProductGroupID 或 prod_name = @ProductName 结束

【问题讨论】:

    标签: asp.net tsql stored-procedures set optional-parameters


    【解决方案1】:

    您可以通过使默认值等于 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 中定义一个存储过程来获取一个表值参数是非常好的。 这里有一篇关于这个主题的文章http://sqlwithmanoj.wordpress.com/2012/09/10/passing-multipledynamic-values-to-stored-procedures-functions-part4-by-using-tvp/

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

    使用多值参数的示例:

    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]
    

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

    【讨论】:

    • 在您的帮助下,我现在了解到的是,如果程序设置了值,则在调用时它是可选的。只要在过程定义中设置,NULL 还是某个值都无关紧要?
    • @DavidSöderlund:是的。
    猜你喜欢
    • 2011-03-06
    • 1970-01-01
    • 2018-07-06
    • 2013-11-26
    • 2022-10-15
    • 2016-04-05
    相关资源
    最近更新 更多