SWA*_*SWA 10 t-sql asp.net stored-procedures set optional-parameters
对我来说是一项重大任务.我有几个问题.你们这些人已经给了我很多帮助,但是我遇到了一个接一个的困难,并且进展缓慢得令人难以置信.这些问题将更好地描述我的任务.
我有一个带有以下控件的aspx页面:TextBox,CheckBoxList,DropDownList.它们用于指定搜索条件.记录使用存储过程从SQL Server数据库中获取.
0)很清楚如何从TextBox传递文本以按名称搜索产品.这里没有问题.
1)每个复选框中的CheckBoxList具有值这是在数据库中的产品组的实际ID.如果选中了多个复选框,如何将ID列表作为一个集传递给存储过程,以便我可以使用IN @IdList?我应该在C#和T-SQL中使用哪些变量类型?有可能吗?
2)DropDownList的第一项是"ALL".选择"ALL"时,我需要将类似NULL的内容传递给存储过程.如果存储过程为NULL,如何使存储过程忽略该参数?
我已经筋疲力尽了,没有任何想法会再出现,我甚至试图分别按每个标准搜索,然后将找到的ID放入单个数组中,比较它们并组成一个带有常见ID的结果数组,但是有很多问题,我不得不使用巨大的静态数组,低效的内存使用,无法创建动态数组,无法检查只有非零元素的交集等等,所以我放弃了这个想法......
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
Run Code Online (Sandbox Code Playgroud)
小智 11
您可以通过使默认值等于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
Run Code Online (Sandbox Code Playgroud)
定义存储过程以在T-SQL中获取表值参数是完全正确的.这是一篇关于这个主题的文章http://sqlwithmanoj.wordpress.com/2012/09/10/passing-multipledynamic-values-to-stored-procedures-functions-part4-by-using-tvp/
如果你需要更多关于谷歌的信息"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
Run Code Online (Sandbox Code Playgroud)
你的答案是正确的大卫,但它有点误导,因为参数等于NULL不会使它成为可选; 它只需要设置为任何值期间.这也会创建可选参数:
CREATE PROCEDURE [dbo].[dcspFilterEmpList]
@ProductName nvarchar(200) = 'DefaultProduct',
@ProductGroupID int = 1
AS
Run Code Online (Sandbox Code Playgroud)
因此可以在不传递任何参数的情况下执行,即:
EXEC [dbo].[dcspFilterEmpList]
Run Code Online (Sandbox Code Playgroud)
我理解这不一定是Piscovetz试图做的事情,但它似乎与所显示的实际主题问题更加匹配,这是一个重要的区别.