通过分隔符解析方式实现向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 OUTPUT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
--BEGIN TRAN --begin transacion
DECLARE @tran_error int; -- error code
SET @tran_error = 0;
BEGIN TRY
declare @location1 int --split index 1
declare @location2 int --split index 2
declare @split1 char(1) --split 1
declare @split2 char(1) --split 2
set @split1 = '*'
set @split2 = ','
declare @str nvarchar(2000)
declare @temp1 nvarchar(2000)
declare @temp2 nvarchar(2000)
declare @id int
declare @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<>0
BEGIN
SET @location2=charindex(@split2,@temp1) -- 第二级分隔符第一个的位置
--PRINT @location2;
WHILE @location2<>0
BEGIN
SET @temp2 = SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))
SET @id = @temp2
PRINT @id;
SET @temp1= right(@temp1,len(@temp1) - charindex(@split2,@temp1))
SET @temp2 = SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))
SET @bankname = @temp2
PRINT @bankname;
SET @temp1= right(@temp1,len(@temp1) - charindex(@split2,@temp1))
SET @temp2 = SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))
SET @province = @temp2
PRINT @province;
SET @temp1= right(@temp1,len(@temp1) - charindex(@split2,@temp1))
SET @temp2 = SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))
SET @city = @temp2
PRINT @city
SET @temp1= right(@temp1,len(@temp1) - charindex(@split2,@temp1))
SET @temp2 = SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))
SET @accountold = @temp2
PRINT @accountold
SET @temp1= right(@temp1,len(@temp1) - charindex(@split2,@temp1))
SET @temp2 = @temp1; --SUBSTRING(@temp1,0,CHARINDEX(@split2,@temp1))
SET @accountnew = @temp2
PRINT @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;
--END
SET @location2=0
END
--print @str
SET @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 TRY
BEGIN CATCH
PRINT '出现异常,错误编号:' + convert(varchar,error_number()) + ',错误消息:' + error_message()
SET @tran_error = @tran_error + 1
END 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)