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




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的话,需要进行响应的处理。
我将会继续关注这个问题。

posted @ 2005-10-17 11:45  jhtchina  阅读(1005)  评论(0)    收藏  举报