SQL Server儲存過程 對陣列引數的迴圈處理

2021-06-18 22:08:50 字數 4307 閱讀 1616

sql server儲存過程 對陣列引數的迴圈處理

方法一 分割

例:通過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 whereid=@tid

set @pointerprev = @pointercurr+1

end

else

break

end

--刪除最後乙個,因為最後乙個後面沒有逗號,所以在迴圈中跳出,需另外再刪除

set @tid=cast(substring(@id,@pointerprev,len(@id)-@pointerprev+1) as int)

delete from news whereid=@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

方法三 xml

應該用sql2000 openxml更簡單,效率更高,**更可讀:

create procedure [dbo].[productlistupdatespeciallist]

( @productid_array nvarchar(2000),

@moduleid int

)

as

delete from productlistspecial wheremoduleid=@moduleid

-- if empty, return

if (@productid_array is null or len(ltrim(rtrim(@productid_array))) = 0)

return

declare @idoc int

exec sp_xml_preparedocument @idoc output, @productid_array

insert into productlistspecial (moduleid,productid)

select

@moduleid,c.[productid]

from

openxml(@idoc, '/products/product', 3)

with (productid int ) as c

where

c.[productid] is not null

exec sp_xml_removedocument @idoc

sql server儲存過程

建立表的語句 create table student sno int primary key,sname nvarchar 30 sgentle nvarchar 2 sage int,sbirth smalldatetime,sdept nvarchar 30 drop table studen...

SQLSERVER儲存過程

sqlserver儲存過程使用說明書 引言首先介紹一下什麼是儲存過程 儲存過程就是將常用的或很複雜的工作,預先用 sql語句寫好並用乙個指定的名稱儲存起來,並且這樣的語句是放在資料庫中的,還可以根據條件執行不同 sql語句,那麼以後要叫資料庫提供與已定義好的儲存過程的功能相同的服務時,只需呼叫 ex...

SQL Server 儲存過程

儲存過程概念 儲存過程優點 儲存過程的介面 儲存過程的解析 編譯過程 儲存過程安全性 檢視儲存過程 加密 解密儲存過程 儲存過程概念 儲存過程 stored procedure 是一組為了完成特定功能的sql語句集,經編譯後儲存在資料庫中。使用者通過指定儲存過程的名字並給出引數 帶參儲存過程 來執行...