具有多值参数

时间:2017-01-04 04:49:03

标签: sql sql-server asp.net-mvc c#-4.0

我正在尝试创建一个存储过程,它将接受where值条件的多值参数,如下所示

ALTER PROC spGetExpectedSalesOrActiveSales @Divisions NVARCHAR(200), @var1 int
AS
BEGIN
    SELECT *
    FROM ABC
    WHERE x = '0' and z=@var1 
        AND y IN (@Divisions) 

END
exec spGetExpectedSalesOrActiveSales 'EE, MM' ,1

如果我使用'ABC'或'ABC,XYZ'代替@Divisions,那么它的工作正常 当我通过API为@Divisions传递单个值然后执行它但是当传递多个值如'ABC,XYX'时,它只是显示没有记录。 我通过API传递的值,它是一个字符串数组。 我没有从查询中获取@Divisions值,而是从API中获取。

3 个答案:

答案 0 :(得分:1)

SQL Server不支持数组。但是,如果你真的必须,有多个ways to fake arrays

答案 1 :(得分:0)

您正试图像这样获取查询

prop

显然你不能像上面那样选择。

在这种情况下,您可以采用两种方式。一个是动态编码,另一个是用户定义功能。

<强>动态:

SELECT *
    FROM ABC
    WHERE x = '0'
        AND y IN ('ABC,XYZ')

答案 2 :(得分:0)

Table Valued Parameters https://www.mssqltips.com/sqlservertip/2112/table-value-parameters-in-sql-server-2008-and-net-c/

之类的内容

它允许将元素数组传递给存储过程。

DataTable _dt;
// create data table to insert items
_dt = new DataTable("Items");
_dt.Columns.Add("ItemID", typeof(string));
_dt.Columns.Add("Name", typeof(string));
_dt.Rows.Add(4, "SuperBowl 9 Hat");
_dt.Rows.Add(5, "SuperBowl 10 T-Shirt");
_dt.Rows.Add(6, "SuperBowl 13 Towel");
_dt.Rows.Add(7, "SuperBowl 14 Helmet");

然后在存储过程中你有这样的东西

CREATE PROCEDURE [dbo].[InsertItemsTVP] @ItemTVP TVP_Items READONLY
AS
BEGIN
 INSERT INTO dbo.Items (ItemID, Name)
 SELECT ItemID, Name
 FROM @ItemTVP
END
GO

阅读有关性能的信息,因为有时使用逗号分隔字符串比使用TVP快得多