Sql 如何在存储过程中传递和使用数组?

Sql 如何在存储过程中传递和使用数组?,sql,sql-server,sql-server-2008,tsql,ado.net,Sql,Sql Server,Sql Server 2008,Tsql,Ado.net,在我的存储过程中,我需要根据用户输入进行选择 查询将是这样的 SELECT A,B FROM MYTABLE WHERE B=array[0] OR B=array[1] OR B=array[2] 数组中的项数我不知道。用户选择将决定数组中元素的数量 我怎样才能做到这一点?如果我可以这样做,就可以避免对数组中的每个元素使用相同的过程。您可以查看 使用用户定义的表声明表值参数 类型。可以使用表值参数发送多行数据 Transact-SQL语句或例程(如存储 过程或函数,而不创建临时表或多个 参

在我的存储过程中,我需要根据用户输入进行选择

查询将是这样的

SELECT A,B FROM MYTABLE WHERE B=array[0] OR B=array[1] OR B=array[2] 
数组中的项数我不知道。用户选择将决定数组中元素的数量

我怎样才能做到这一点?如果我可以这样做,就可以避免对数组中的每个元素使用相同的过程。

您可以查看

使用用户定义的表声明表值参数 类型。可以使用表值参数发送多行数据 Transact-SQL语句或例程(如存储 过程或函数,而不创建临时表或多个 参数

此外,您可能希望将其作为XML参数传递,然后将其转换为SP中的表

您甚至可以传入一个带分隔符的字符串,并将其拆分为一个表

使用用户定义的表声明表值参数 类型。可以使用表值参数发送多行数据 Transact-SQL语句或例程(如存储 过程或函数,而不创建临时表或多个 参数

此外,您可能希望将其作为XML参数传递,然后将其转换为SP中的表


您甚至可以传入一个带分隔符的字符串,并将其拆分为一个表,而不是创建一个数组

将页面中的单列
DataTable
作为参数传递(值与该数组中的值相同)

在这个过程中,你们可以使用它如下

CREATE PROCEDURE proc_name
    @array dbo.type_name READONLY
AS
   SELECT A,B FROM MYTABLE WHERE B IN (select column1 from @array)

您可以创建一个

将页面中的单列
DataTable
作为参数传递(值与该数组中的值相同)

在这个过程中,你们可以使用它如下

CREATE PROCEDURE proc_name
    @array dbo.type_name READONLY
AS
   SELECT A,B FROM MYTABLE WHERE B IN (select column1 from @array)
试试这个

发送逗号分隔的字符串而不是数组

DECLARE @array0 VARCHAR(MAX)
--Commaseprated string array0
DECLARE @tmpArray0 TABLE ( value1 VARCHAR(500) )
--table for Commaseprated string array0

WHILE CHARINDEX(',', @tmpArray0) > 0 
    BEGIN
        INSERT  INTO @tmpArray1
                SELECT  SUBSTRING(@array0, 1, ( CHARINDEX(',', @array0) - 1 ))
        SET @array0 = SUBSTRING(@array0, CHARINDEX(',', @array0) + 1,
                                LEN(@array0))
    END

DECLARE @array1 VARCHAR(MAX)
--Commaseprated string array1
DECLARE @tmpArray1 TABLE ( value1 VARCHAR(500) )
--table for Commaseprated string array1

WHILE CHARINDEX(',', @array1) > 0 
    BEGIN
        INSERT  INTO @tmpArray1
                SELECT  SUBSTRING(@array1, 1, ( CHARINDEX(',', @array1) - 1 ))
        SET @array1 = SUBSTRING(@array1, CHARINDEX(',', @array1) + 1,
                                LEN(@array1))
    END


DECLARE @array2 VARCHAR(MAX)
--Commaseprated string array2
DECLARE @tmpArray2 TABLE ( value1 VARCHAR(500) )
--table for Commaseprated string array2

WHILE CHARINDEX(',', @array2) > 0 
    BEGIN
        INSERT  INTO @tmpArray2
                SELECT  SUBSTRING(@array2, 1, ( CHARINDEX(',', @array2) - 1 ))
        SET @array2 = SUBSTRING(@array2, CHARINDEX(',', @array2) + 1,
                                LEN(@array2))
    END


SELECT  A ,
        B
FROM    MYTABLE
WHERE   B IN ( SELECT   value1
               FROM     @tmpArray0 AS ta )
        OR B IN ( SELECT    value1
                  FROM      @tmpArray1 AS ta )
        OR B IN ( SELECT    value1
                  FROM      @tmpArray2 AS ta )
试试这个

发送逗号分隔的字符串而不是数组

DECLARE @array0 VARCHAR(MAX)
--Commaseprated string array0
DECLARE @tmpArray0 TABLE ( value1 VARCHAR(500) )
--table for Commaseprated string array0

WHILE CHARINDEX(',', @tmpArray0) > 0 
    BEGIN
        INSERT  INTO @tmpArray1
                SELECT  SUBSTRING(@array0, 1, ( CHARINDEX(',', @array0) - 1 ))
        SET @array0 = SUBSTRING(@array0, CHARINDEX(',', @array0) + 1,
                                LEN(@array0))
    END

DECLARE @array1 VARCHAR(MAX)
--Commaseprated string array1
DECLARE @tmpArray1 TABLE ( value1 VARCHAR(500) )
--table for Commaseprated string array1

WHILE CHARINDEX(',', @array1) > 0 
    BEGIN
        INSERT  INTO @tmpArray1
                SELECT  SUBSTRING(@array1, 1, ( CHARINDEX(',', @array1) - 1 ))
        SET @array1 = SUBSTRING(@array1, CHARINDEX(',', @array1) + 1,
                                LEN(@array1))
    END


DECLARE @array2 VARCHAR(MAX)
--Commaseprated string array2
DECLARE @tmpArray2 TABLE ( value1 VARCHAR(500) )
--table for Commaseprated string array2

WHILE CHARINDEX(',', @array2) > 0 
    BEGIN
        INSERT  INTO @tmpArray2
                SELECT  SUBSTRING(@array2, 1, ( CHARINDEX(',', @array2) - 1 ))
        SET @array2 = SUBSTRING(@array2, CHARINDEX(',', @array2) + 1,
                                LEN(@array2))
    END


SELECT  A ,
        B
FROM    MYTABLE
WHERE   B IN ( SELECT   value1
               FROM     @tmpArray0 AS ta )
        OR B IN ( SELECT    value1
                  FROM      @tmpArray1 AS ta )
        OR B IN ( SELECT    value1
                  FROM      @tmpArray2 AS ta )


将XML作为varchar传递给存储过程,然后将其转换为表值对。对吗?但是我如何在上面的WHERE条件中使用这些表值对呢?您可能必须将其与ROW_NUMBER一起使用,并将其分配给变量,或者使用子选择。如果我可以将这些键值对与上面的select查询进行内部连接,结果将与我们预期的一样。对吗?但我可以使用Innerjoin吗?您可以使用Innerjoin,也可以使用sub-select。将XML作为varchar传递给存储过程,然后将其转换为表值对。对吗?但是我如何在上面的WHERE条件中使用这些表值对呢?您可能必须将其与ROW_NUMBER一起使用,并将其分配给变量,或者使用子选择。如果我可以将这些键值对与上面的select查询进行内部连接,结果将与我们预期的一样。对吗?但是我可以使用Innerjoin吗?您可以使用Innerjoin,也可以使用sub-select。键入\u-name有什么用?它只是一个名称。。该表类型的用户定义名称需要注意的是,您必须将datatble from page作为参数传递,该参数具有与该表类型相同的列和名称
type\u name
的用法是什么?它只是一个名称。。该表类型的用户定义名称需要注意的是,您必须将datatble from页作为参数传递,该参数具有与该表类型相同的列和名称。请在代码中添加一些说明,以便于理解。请在代码中添加一些说明,以便于理解。