问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-23 19:52

我来回答

2个回答

热心网友 时间:2022-04-10 11:47

方法一 分割

例:通过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

热心网友 时间:2022-04-10 13:05

什么语言?T-SQL还是Oracle?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
平安e家保是什么险 2023年高级会计师报名时间和条件 2022高级会计师报考条件要求是什么? 问几个英文语法问题,希望能正确回答~ 女生锁骨下长痣,左右都有 不是很对称 寓意什么呐? 抖音上传照片音乐短怎么办 断夜奶好方法 婴儿断夜奶最佳方法 建设银行,你打算坑害多少优质客户? 【PS教程】如何做出凹陷字体效果的氛围海报 C#存储过程传参数问题 请问如何给DB2数据库的存储过程中 where 的in 条件传参数? 存储过程中的表,如何使用 传参数的方式实现 如何给DB2数据库的存储过程中 where 的in 条件传参数 SQL中存储过程参数传递有哪几种方法?如何获取存储过程的返回值?_百 ... sql 存储过程 怎么传入参数 青龙虾和红龙虾,这两者的区别是什么? 小龙虾市场前景怎样 江苏盱眙和湖北潜江,哪个地方才能称得上是中国小龙虾之都呢? 监利县龙虾节2O19年什么时开 本币贬值的对股市的影响 人民币贬值对股市影响到底能有多大 人民币贬值对股市有什么影响吗? 如果人民币贬值,对股市会有什么影响 人民币贬值,对股市有哪些影响? LOL英雄时刻录制按钮不见了 人民币贬值,对股市有影响吗? lol明明打开了录制功能,但是进去游戏看不到录制按钮,网上很多方法都试过没有用 人民币贬值对股市有何影响,特别对银行股? 为什么LOL设置了录制但是游戏里没有录制按钮配置是可以的 Oracle调用存储过程多个入参可以不全部传参么? 为什么利用存储过程传参可以防止SQL注入式攻击呢? sql sever 存储过程 传参(字符串) 不锈钢是不是永远不会生锈? 如何给SQLSERVER存储过程传递数组参数 oracle存储过程,为什么创建的时候还要传参数?不是应该调用的时候传吗? 存储过程最多能传多少个参数 不锈钢会生锈的吗? sqlapi怎么给存储过程传参 mysql存储过程把字段作为传入参数 不锈钢会不会生锈? sql存储过程参数可省略吗? 存储过程中参数都有默认值,调用时可不可以不... 求苹方字体mac? 字体网上的字体mac系统上能用吗 如何给电脑装影子系统? 统一汤达人方便面里面有几个配料包,都有些什么啊? 汤达人海鲜面有几包调味料 汤达人的酱包为什么要等到注水三分钟后再加? 统一汤达人方便面里面有几个配料包,都有些什么 汤达人海鲜拉面为什么只有两包调料包