簡體   English   中英

將集合和可選參數傳遞給存儲過程 T-SQL - ASP.NET

[英]Passing sets and optional parameters to a stored procedure T-SQL - ASP.NET

我有一個帶有以下控件的aspx 頁面TextBox, CheckBoxList, DropDownList 它們用於指定搜索條件。 這些記錄是使用存儲過程從SQL Server 數據庫中獲取的。

  1. CheckBoxList的每個復選框有一個值,其是在數據庫中的產品組的實際ID。 如果選擇了多個復選框,如何將 ID 列表作為一組傳遞給存儲過程,以便我可以使用IN @IdList 我應該在 C# 和 T-SQL 中使用哪些變量類型? 有可能嗎?

  2. DropDownList的第一項是“ALL”。 選擇“全部”時,我需要將像空相同的東西傳遞給存儲過程。 如果參數為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

您可以通過使默認值等於 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/

如果您需要有關此谷歌的“表值參數”的更多信息

使用多值參數的示例:

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

你的回答是正確的大衛,但它有點誤導,因為等於 NULL 的參數並沒有使它成為可選的; 它只需要設置為任何值期。 這也會創建可選參數:

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

因此可以在不傳遞任何參數的情況下執行,即:

EXEC [dbo].[dcspFilterEmpList]

我知道這不一定是 Piscovetz 想要做的,但它似乎更接近於顯示的實際主題問題,這是一個重要的區別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM