如何向存储过程传递一个数组参数

如题所述

第1个回答  推荐于2018-04-11
方法一 分割

例:通过SQL Server存储过程传送数组参数删除多条记录

eg. ID 值为'1,2,3' 以下存储过程就是删除表中id号为1,2,3的记录:

CREATE PROCEDURE DeleteNews
@ID nvarchar(500)
as
DECLARE @PointerPrev int
DECLARE @PointerCurr int
DECLARE @TId int
Set @PointerPrev=1

while (@PointerPrev < LEN(@ID))
Begin
Set @PointerCurr=CharIndex(',',@ID,@PointerPrev)
if(@PointerCurr>0)
Begin
set @TId=cast(SUBSTRING(@ID,@PointerPrev,@PointerCurr-@PointerPrev) as int)
Delete from News where ID=@TID
SET @PointerPrev = @PointerCurr+1
End
else
Break
End
--删除最后一个,因为最后一个后面没有逗号,所以在循环中跳出,需另外再删除
set @TId=cast(SUBSTRING(@ID,@PointerPrev,LEN(@ID)-@PointerPrev+1) as int)
Delete from News where ID=@TID
GO

这个方法麻烦不?于是又有另外一种方法——临时表

方法二 Table对象

传3个参数,都是数组形式还有时间类型用存储过程更新

@Oid = 1,2,3,4

@Did = 111,222,333,444

@DateArr = '2007-1-1,2007-1-2,2007-1-3,2007-1-4'

CREATE proc Test999

@Oid nvarchar(1000) --ID1

,@Did nvarchar(1000) --ID2

,@DateArr nvarchar(1000) --日期

AS

DECLARE @id1s varchar(8000), @id2s varchar(8000), @dates varchar(8000)

set @id1s=@Oid

set @id2s=@Did

set @dates = @DateArr

-- 调用函数实现处理

SELECT @id1s=@id1s, @id2s=@id2s,@dates = @dates

UPDATE A SET terminate_time = B.dt

FROM [Table] A,(

SELECT

id1 = CONVERT(int, Desk_id.value),

id2 = CONVERT(int, room_id.value),

dt = CONVERT(datetime, terminate_time.value)

FROM dbo.f_splitstr(@id1s) Desk_id, dbo.f_splitstr(@id2s) room_id, dbo.f_splitstr(@dates) terminate_time

WHERE Desk_id.id = room_id.id

AND Desk_id.id = terminate_time.id

) B

WHERE A.Desk_id = B.ID1 AND A.room_id = B.ID2

GO这个还用到一个函数f_splitstr

CREATE FUNCTION dbo.f_splitstr(

@str varchar(8000)

)RETURNS @r TABLE(id int IDENTITY(1, 1), value varchar(5000))

AS

BEGIN

DECLARE @pos int

SET @pos = CHARINDEX(',', @str)

WHILE @pos > 0

BEGIN

INSERT @r(value) VALUES(LEFT(@str, @pos - 1))

SELECT

@str = STUFF(@str, 1, @pos, ''),

@pos = CHARINDEX(',', @str)

END

IF @str > ''

INSERT @r(value) VALUES(@str)

RETURN

END本回答被提问者和网友采纳
第2个回答  2015-03-27
什么语言?T-SQL还是Oracle?

存储过程怎么传入数组参数
set @TId=cast(SUBSTRING(@ID,@PointerPrev,LEN(@ID)-@PointerPrev+1) as int)Delete from News where ID=@TID GO 这个方法麻烦不?于是又有另外一种方法——临时表 方法二 Table对象 传3个参数,都是数组形式还有时间类型用存储过程更新 Oid = 1,2,3,4 Did = 111,222,333,444 DateArr ...

如何给SQL SERVER存储过程传递数组参数
1、你可以使用几个VARCHAR(255)字段来模拟数组,字段中用逗号分开各个数据,然后使用循环和PATINDEX和SUBSTR分开这些数据。2. The more usual way to do this would be to populate a temporary table with the values you need and then use the contents of that table from within the stored-pr...

如何给SQLSERVER存储过程传递数组参数
1、将数组转换为字符串格式(例如:a,b,c,d)2、在数据库内创建字符串分割为行的表值函数 3、若是需要将一个二维数组传递的话,需要将每列数据都格式化为1的方式,然后再用2的方式转换为行,再将转换后的数据组合为一个表 4、你就可以直接进行插入、编辑、删除或查询操作了。

oracle 存储过程,如何传入一个数组
这个是不行的,数组内容必须首先在存储过程里定义好数组类型,然后给予定义好的数据类型定义数组型变量。存储过程的入参是做不到的。一般情况下,采用字符串的方式,并给每项用特定的分隔符的方式传入,然后在存储过程中按照分隔符解析出每一项,插到存储过程的定义的数组的每一项上去。

java字符串数组作为参数传递oracle存储过程
用字符串传。先组成一个字符串,比如多个值之间用逗号分隔开,传进去之后再按照分隔符分成数组,应该是一个办法。

mysql 存储过程支持传入数组参数么
创建方法:SqlParameter[] paras = new SqlParameter[]{ new SqlParameter("@PageIndex","ccc"),new SqlParameter("@PageSize","ccc"),new SqlParameter("@StrSql","ccc")};ccc就是你想传入的值,带@的就是你在存储过程中定义的参数。算是一种另类的数组吧。要不你就把所有条件组合成一个字符串...

java字符串数组作为参数传递oracle存储过程
建议你用字符串的方式存储数组,假如你有3个id的list分别为1,2,3,你可以传1,2,3这样的字符串给存储过程然后在存储过程里面再切割写逻辑。只在数据库里面用其定义的数组传递参数,没有用java传数组值,楼主若找到办法了,也请告知一声。

sql存储过程数组参数超难问题
如:‘001,002,003’。中间用特殊符号分隔,然后写一个存储过程,用来分隔。如,分隔:‘001,002,003’,返回结果为‘001’和‘002,003’,两者都是输出参数。将这个存储过程用while(原字符串)内调用,就相当于一个for循环了。你可以先自己写一下 如果想要,我可以给你。QQ:373023677 ...

在pb里调用存储过程的时候,如何传递数组变量
你调用的存储过程需要的变量放在一个数组中了是吧,你的数组是怎麼存储变量的,比如:存储过程需要两个变量@year char(4),@month integer,这两个变量是怎麼存储在数组中的呢?比如是这样存储的吧 @year + @month ,这样的格式存储的数组 string ls_string,ls_year integer li_month,li_persion ar...

oracle测试存储过程传入数组怎么传
在存储过程中使用自定义类型NESTEDARRAY。PROCEDURE GET_ARR_RESULT(INPUTARRAY IN NESTEDARRAY, AR OUT NESTEDARRAY) IS BEGIN AR := NESTEDARRAY();FOR I IN 1 .. INPUTARRAY.COUNT LOOP AR.EXTEND;AR(I) := I|| INPUTARRAY(I);END LOOP;END GET_ARR_RESULT;Java代码:import java.sql....

相似回答