如何使用存储过程在参数中传递多个值

时间:2015-09-23 14:00:37

标签: c# sql

这是我的存储过程。有人说使用TVP我可以得到我想要的输出。但我是sql的新手。所以,请有人帮助我,如何通过多个disposeid和多个receiveid,如下所示。现在我需要输出只能使用我能够理解什么是tvp所以有人请编辑我的SP通过其中包含多个值。

 USE [Test]
    GO

    /****** Object:  StoredProcedure [dbo].[up_Get_Customers]    Script Date: 09/23/2015 19:10:23 ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO




    ALTER PROC [dbo].[up_Get_Customers]
    (
        @DisposeId int

    )
    AS
    BEGIN

        SELECT C1.DisposeDate,C1.DisposeID,C1.ReceiveDate,C1.ReceiveID
        FROM Customers C1 
        LEFT JOIN Customers C2 ON C1.DisposeID=C1.ReceiveID 
        WHERE @DisposeId IS NULL OR (C1.DisposeID in (@DisposeId,','))
       END

    GO

1 个答案:

答案 0 :(得分:1)

嗯,这是我今天学到的新东西,用微小数量的谷歌搜索我想出了这个

https://msdn.microsoft.com/en-us/library/bb510489%28SQL.100%29.aspx

TVP T V P 参与者。

所以基于链接中的信息:

CREATE TYPE DisposeIdsTable AS TABLE (
    DisposeId VARCHAR(50));
GO

然后

USE [Test]
GO

/****** Object:  StoredProcedure [dbo].[up_Get_Customers]    Script Date: 09/23/2015 19:10:23 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER PROC [dbo].[up_Get_Customers]
(
    @DisposeIds DisposeIdsTable READONLY
)
AS
BEGIN

    SELECT C1.DisposeDate,C1.DisposeID,C1.ReceiveDate,C1.ReceiveID
    FROM Customers C1 
    LEFT JOIN Customers C2 ON C1.DisposeID=C1.ReceiveID 
    WHERE (SELECT COUNT(*) FROM @DisposeIds) = 0
        OR
        (C1.DisposeID IN (
            SELECT DisposeID FROM @DisposeIds
            UNION ALL
            SELECT ',')))
   END

GO

N.B。上面发布的代码根本未经过测试,因此可能包含错误。此外,我对DisposeId的数据类型做了一个假设,因此不太可能是正确的,需要修改以适合您的数据类型。此外,我试图保留查询的现有逻辑,无论可能是什么。

执行存储过程时,您需要声明类型为DisposeIdsTable的变量,而不是当前正在使用的文本数据类型。然后需要使用您的ID填充该表变量。