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页作为参数传递,该参数具有与该表类型相同的列和名称。请在代码中添加一些说明,以便于理解。请在代码中添加一些说明,以便于理解。