如何将数据集作为输入参数传递给存储过程?

时间:2011-10-06 03:41:14

标签: asp.net sql-server

  

可能重复:
  Pass a list-structure as an argument to a stored procedure

我有一个包含多个逗号分隔值的会话变量。我使用Split函数将这些值存储在数组中。现在我需要将此数组传递给存储过程。这是可能的,如果是,我该如何使用它存储过程中的数组?

2 个答案:

答案 0 :(得分:1)

如果您使用的是Sql Server 2008,请尝试将其作为表值参数传递:

Table Value Parameter in SQL Server 2008 and .NET (C#)

答案 1 :(得分:0)

之前我遇到过这个完全相同的情况,这就是我所做的:

不是将变量拆分为代码中的数组,而是将整个逗号分隔文本字符串作为nvarchar传递给存储过程。然后我创建了一个数据库函数,它接受传入的值和分隔符,并返回分割值的表。见下文......

    CREATE FUNCTION [dbo].[split]
    (
        @DataToSplit NVARCHAR(MAX),
        @Delimiter NVARCHAR(5)
    )
    RETURNS @ReturnVal AS TABLE
    (
        ID INT IDENTITY(1, 1),
        Item NVARCHAR(200)
    )
    AS
    BEGIN

        WHILE (CHARINDEX(@DELIMITER, @DataToSplit) > 0)
        BEGIN

            INSERT INTO @ReturnVal
            (
                Item
            )
            VALUES
            (
                SUBSTRING(@DataToSplit, 1, CHARINDEX(@Delimiter, @DataToSplit) - 1)
            )

            SET @DataToSplit = SUBSTRING(@DataToSplit, CHARINDEX(@Delimiter, @DataToSplit) + 1, LEN(@DataToSplit))
        END

        -- Grab the last item of the separated list of items
        INSERT INTO @ReturnVal
        (
            Item
        )
        VALUES
        (
            @DataToSplit
        )

        RETURN

    END

一旦你创建了split函数,你就可以在存储过程中使用它来传递分隔文本并以各种方式使用它,例如......

    CREATE PROCEDURE [dbo].[ExampleProc]
        @Values NVARCHAR(MAX)
    AS

        SET NOCOUNT ON;

        SELECT Item
        FROM [dbo].[split](@Values, ',')

        -- OR

        SELECT Item
        FROM [dbo].[SomeTable]
        WHERE Item IN 
        (
           SELECT Item FROM [dbo].[split](@Values, ',')
        )

        -- OR

        SELECT a.Item
        FROM [dbo].[SomeTable] AS a
        INNER JOIN [dbo].[split](@Values, ',') AS b
            ON a.ID = b.ID
    GO