SQL学习笔记[5] - 通过分隔符解析方式实现向SQL存储过程传递数组参数

来源:互联网 发布:linux shell 输入 编辑:程序博客网 时间:2024/06/08 10:09

通过分隔符解析方式实现向SQL存储过程传递数组参数,一维数组比较简单,这里实现二维数组,以下直接代码。

事务我注释掉了,调试的时候用不上,大家需要用的时候自行加上或者删去。

@AccountInfo参数就是数组的完整字符串,通过解析它得到我们要的数组元素,然后用把元素组装到处理具体业务功能的sql语句中,如本例中注释掉的update语句。

执行结果示例附后。

-- =============================================-- Author:<yuexiang>-- Create date: <2015.10.11>-- Description:comfirm back info In OA-- =============================================CREATE PROCEDURE [MaterialControl].[公司级合格厂商银行账户信息确认] -- Add the parameters for the stored procedure here@VendorComID int,@AccountInfo nvarchar(2000),@Comfirmer varchar(30),@ComfirmTime datetime,@SheetNumber varchar(100),@iRel int OUTPUTASBEGIN-- SET NOCOUNT ON added to prevent extra result sets from-- interfering with SELECT statements.--BEGIN TRAN --begin transacionDECLARE @tran_error int;  -- error codeSET @tran_error = 0;BEGIN TRY declare @location1 int    --split index 1declare @location2 int    --split index 2declare @split1 char(1)   --split 1declare @split2 char(1)   --split 2set @split1 = '*'set @split2 = ','declare @str nvarchar(2000)declare @temp1 nvarchar(2000)declare @temp2 nvarchar(2000)declare @id intdeclare @bankname varchar(200)declare @province varchar(50)declare @city varchar(50)declare @accountold varchar(100)declare @accountnew varchar(100)DECLARE @oaStatusCode char(1)PRINT @AccountInfo;set @str=ltrim(rtrim(@AccountInfo))--PRINT @str;set @location1=charindex(@split1,@str)  -- 第一级分隔符第一个的位置    --PRINT @location1;    SET @temp1 = SUBSTRING(@str,0,CHARINDEX(@split1,@str))  --第一行银行信息    --PRINT @temp1;    WHILE @location1<>0BEGINSET @location2=charindex(@split2,@temp1)  -- 第二级分隔符第一个的位置    --PRINT @location2;WHILE @location2<>0BEGINSET @temp2 = SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))SET @id = @temp2PRINT @id;SET @temp1= right(@temp1,len(@temp1) - charindex(@split2,@temp1))SET @temp2 = SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))SET @bankname = @temp2PRINT @bankname;SET @temp1= right(@temp1,len(@temp1) - charindex(@split2,@temp1))SET @temp2 = SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))SET @province = @temp2PRINT @province;SET @temp1= right(@temp1,len(@temp1) - charindex(@split2,@temp1))SET @temp2 = SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))SET @city = @temp2PRINT @citySET @temp1= right(@temp1,len(@temp1) - charindex(@split2,@temp1))SET @temp2 = SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))SET @accountold = @temp2PRINT @accountoldSET @temp1= right(@temp1,len(@temp1) - charindex(@split2,@temp1))SET @temp2 =  @temp1;  --SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))SET @accountnew = @temp2PRINT @accountnew--SELECT @oaStatusCode = OA确认代码 FROM MaterialControl.供货商企业级关键信息修改记录表 WHERE ID =@id;--IF(@oaStatusCode = 'A')--BEGIN--UPDATE MaterialControl.供货商企业级银行账户表 SET 开户银行名称 = @bankname,开户银行所在省=@province,开户银行所在市=@city,银行账号=@accountnew WHERE 厂商企标ID=@VendorComID AND 银行账号 =@accountold;--ENDSET @location2=0END--print @strSET @str = right(@str,len(@str) - charindex(@split1,@str));SET @location1=charindex(@split1,@str);SET @temp1 = SUBSTRING(@str,0,CHARINDEX(@split1,@str))  --下一个银行信息;--PRINT @temp1;--PRINT @location1;END--UPDATE MaterialControl.供货商企业级关键信息修改记录表 SET 记录状态代码 = 'C',确认人=@Comfirmer,确认时间=@ComfirmTime WHERE 表单编号 = @SheetNumber;END TRYBEGIN CATCHPRINT '出现异常,错误编号:' + convert(varchar,error_number()) + ',错误消息:' + error_message()SET @tran_error = @tran_error + 1END CATCH--IF(@tran_error > 0)--    BEGIN--        --执行出错,回滚事务--        ROLLBACK TRAN;--        SET @iRel = -1;--    END--ELSE--    BEGIN--        --没有异常,提交事务--        COMMIT TRAN;--        SET @iRel = 1;--    END  END

执行参数@AccountInfo='13,招商银行,湖北省,武汉市2,62141111,62142222*14,中国工商银行,广东省,广州市3,62128888,62129999*'

* 是数据元素分隔符

, 是数组元素内部元素的分隔符

执行结果如图所示(环境:sql server 2008)



0 0
原创粉丝点击