SQL Server SP - 为“IN”数组列表传递参数?

Posted

技术标签:

【中文标题】SQL Server SP - 为“IN”数组列表传递参数?【英文标题】:SQL Server SP - Pass parameter for "IN" array list? 【发布时间】:2009-02-11 14:41:27 【问题描述】:

有没有办法将值数组作为 SQL Server 2005 的单个参数传递到 SP 的 IN 部分?

例如:Select * from MyTable where ID IN(@MyValueArray)

【问题讨论】:

复制:***.com/questions/144550/… 复制:***.com/questions/337704/… T-SQL stored procedure that accepts multiple Id values的可能重复 【参考方案1】:

在 2005 年及更早的版本中,您不能将数组作为参数传递给存储过程,而是要模拟此功能,将逗号分隔的 ID 列表作为 VARCHAR 参数传递。然后,您需要解析这个列表,将每个 id 添加到变量表中。然后在表的结果上使用 IN。这不是一个优雅的解决方案,但它是你能做的最好的。

DECLARE @List TABLE (ID INT)

INSERT @List VALUES ('123')
INSERT @List VALUES ('12')

SELECT *
FROM
    MyTable
WHERE
    MyTableID IN (SELECT ID FROM @List)

这最好通过创建一个函数来实现,该函数将 id 列表作为字符串接收并以表格形式返回您的 ID 列表。

IF EXISTS(
    SELECT *
    FROM sysobjects
    WHERE name = 'ParseIDArray')
BEGIN
    DROP FUNCTION ParseIDArray
END
GO

CREATE FUNCTION [dbo].[ParseIDArray] (@IDList VARCHAR(8000))
RETURNS
    @IDListTable TABLE (ID INT)
AS
BEGIN

    DECLARE
        --@IDList VARCHAR(100),
        @LastCommaPosition INT,
        @NextCommaPosition INT,
        @EndOfStringPosition INT,
        @StartOfStringPosition INT,
        @LengthOfString INT,
        @IDString VARCHAR(100),
        @IDValue INT

    --SET @IDList = '11,12,113'

    SET @LastCommaPosition = 0
    SET @NextCommaPosition = -1

    IF LTRIM(RTRIM(@IDList)) <> ''
    BEGIN

        WHILE(@NextCommaPosition <> 0)
        BEGIN

            SET @NextCommaPosition = CHARINDEX(',',@IDList,@LastCommaPosition + 1)

            IF @NextCommaPosition = 0
                SET @EndOfStringPosition = LEN(@IDList)
            ELSE
                SET @EndOfStringPosition = @NextCommaPosition - 1

            SET @StartOfStringPosition  = @LastCommaPosition + 1
            SET @LengthOfString = (@EndOfStringPosition + 1) - @StartOfStringPosition

            SET @IDString =  SUBSTRING(@IDList,@StartOfStringPosition,@LengthOfString)                  

            IF @IDString <> ''
                INSERT @IDListTable VALUES(@IDString)

            SET @LastCommaPosition = @NextCommaPosition

        END --WHILE(@NextCommaPosition <> 0)

    END --IF LTRIM(RTRIM(@IDList)) <> ''

    RETURN

ErrorBlock:

    RETURN

END --FUNCTION

这是一个使用此函数创建一个存储过程的示例,该存储过程接收一个 ID 列表

IF EXISTS (SELECT * FROM sysobjects WHERE name = 'TestArrayParameter')
BEGIN
    DROP PROCEDURE TestArrayParameter
END
GO



CREATE PROCEDURE TestArrayParameter
    @ArrayParameter VARCHAR(8000)
AS
BEGIN


    SELECT *
    FROM TestTable123
    WHERE TestTblID IN (SELECT ID FROM [dbo].[ParseIDArray](@ArrayParameter))

    -- OR BETTER

    SELECT *
    FROM
        TestTable123 test
        INNER JOIN [dbo].[ParseIDArray](@ArrayParameter) list
         ON list.ID = test.TestTblID

END
GO

CREATE TABLE TestTable123  (TestTblID INT, TestTblVal VARCHAR(50))

INSERT TestTable123 VALUES (3,'Three')
INSERT TestTable123 VALUES (25,'Twenty Five')
INSERT TestTable123 VALUES (100,'One Hundred')

DECLARE @IDList VARCHAR(8000)

SET @IDList = '25,100'

EXEC TestArrayParameter @IDList

DROP TABLE TestTable123

【讨论】:

以上是关于SQL Server SP - 为“IN”数组列表传递参数?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 Sql Server 中使用整数数组参数创建 sp? [复制]

sql server 查询表 in一个数组

在 SQL Server 2008 中使用 sp_send_dbmail 传递的邮件很少

JPQL IN 子句:Java 数组(或列表、集合...)?

Select In SQL Server-Cross Instance in same domain and different domain

Dapper use Table Value Parameter in C# (Sql Server 数组参数)