存储过程里面实现类似与数组的传递



CREATE function dbo.f_split(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(sqlstr varchar(100))
--实现split功能 的函数
--date :2005-5-30
--Author :
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>'\'
insert @temp values(@SourceSql)
return
end
--引用的实例--
--select * from f_split( 'aaa|bb','|')
以上存储过程 是学习别人写的得到。
使用举例(传入多条SQL语句,然后执行。如果成功提交事务,如果失败 回滚事务):
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO

/*
目的: 传入多条SQL语句同时在一个事务中执行
时间:
作者:
*/
ALTER PROCEDURE sp_InsertMuchRow
@GoodsBill_Array varChar(4000)

AS

SET QUOTED_IDENTIFIER OFF
declare @SQL varchar(1000) --定义存放SQL命令的字符串
declare @errorid int 
set @errorid=0
--开启事务
begin transaction
--定义一个光标,从传入的SQL语句中分解出所有的SQL语句,然后一一执行
declare curGoods cursor FOR select sqlstr from f_split( @GoodsBill_Array,'|') 
open curGoods fetch next from curGoods INTO @SQL
while @@fetch_status = 0
begin
--执行SQL命令
EXEC( @SQL) 
if @@error<>0
begin
set @errorid=1
break
end
fetch next from curGoods INTO @SQL
end
--关闭光标
close curGoods
deallocate curGoods
--判断是否报错了,如果报错则回退事务,没有则提交事务
if @errorid=0 -- if @@error<>0
begin
commit transaction
end
else
begin
rollback transaction
--RAISERROR ('传入的SQL语句执行出错', 16, 1)
end
SET QUOTED_IDENTIFIER On
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

个人感觉比较经典一些的代码
事例2:
来自:http://www.chinaitpower.com/A/2005-04-24/156141.html
create function f_split(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(a varchar(100))
--实现split功能 的函数
--date :2005-4-20
--Author :Domino
as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>'\'
insert @temp values(@SourceSql)
return
end


用法:select * from dbo.f_split('A:B:C:D:E',':')
现在存在这样的问题,传入的字符型变量超过8000的话,需要进行响应的处理。
我将会继续关注这个问题。

浙公网安备 33010602011771号