Asp.net

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

  • September 21, 2020

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

  1. CheckBoxList中的每個CheckBox都有一個值,該值是數據庫中產品組的實際 ID。如果選中了多個複選框,如何將 ID 列表作為一組傳遞給儲存過程,以便我可以使用IN @IdList?我應該在 C# 和 T-SQL 中使用哪些變數類型?有可能嗎?
  2. DropDownList的第一項是“ALL”。選擇“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

您可以通過使預設值等於 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

引用自:https://stackoverflow.com/questions/16167793